我正在TensorFlow中训练一个模型,当我从训练后的模型进行评估时,该模型可以很好地工作。
但是,在很多时候,我要保存一个检查点,然后加载该检查点以对其进行评估。加载的网络只会输出NaN。
使用tfdbg并在输入输入结束时运行过滤器“ has_inf_or_nan”,显示出网络中的第一个NaN出现在一个批归一化层中的moving_mean和moving_variance变量中。
通过以下代码进行保存:
with self.graph.as_default():
if not self.saver:
self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=10000)
save_dir = create_save_dir(path, name)
return self.saver.save(self.session, save_dir, global_step=iteration, write_meta_graph=True)
正在通过以下代码加载:
with self.graph.as_default():
save_dir = create_save_dir(load_dir, load_name)
self.saver = tf.train.import_meta_graph(save_dir + "-" + str(iteration) + ".meta")
self.saver.restore(self.session, save_dir + "-" + str(iteration))
self.input_layer = self.graph.get_tensor_by_name("network/input_layer:0")
self.out_policy_layer = self.graph.get_tensor_by_name("network/out_policy_layer:0")
self.out_value_layer = self.graph.get_tensor_by_name("network/out_value_layer/Tanh:0")
self.is_training = self.graph.get_tensor_by_name("network/is_training:0")
同样,让我怀疑我的保存/加载例程出现问题的原因是,如果我通过训练有素的网络运行,网络将输出有效的结果。通过加载的网络运行某些内容时,我只会得到NaN。
进行编辑以添加使用以下代码创建我的批处理规范:
def _conv_block(self, name, input_layer, filter_size, num_input_channels, num_output_channels):
weights = self._create_weights_for_layer(f"{name}_weights",
shape=[filter_size[0],
filter_size[1],
num_input_channels,
num_output_channels],
use_regularizer=self._config.l2_regularizer)
conv = self._conv2d(input_layer, weights, strides=[1, 1, 1, 1], padding="SAME", name=f"{name}_conv")
bn = self._conv_batch_norm(conv, f"{name}_batch_norm")
return tf.nn.relu(bn, name=f"{name}_act")
def _conv_batch_norm(self, input_layer, name):
return tf.layers.batch_normalization(input_layer, axis=CHANNEL_SHAPE_INDEX, center=True, scale=True, training=self.is_training,
momentum=self._config.batch_norm_momentum,
name=name)
答案 0 :(得分:0)
长话短说,如果您的模型中出现随机的NaN,并且您已经查看了通常的可疑物,请考虑一下这样的事实:在浪费数百小时之前,硬件可能会发生故障。
这是由内存即将耗尽的视频卡引起的。我以为我们遇到了软件问题,却没有想到这一点。培训是在另一台PC上进行的,没有遇到任何问题。
这是我们最终遇到硬件问题的原因。我们以前曾在旧PC上经历过随机发生的NaN。我们花了数百个小时调试模型,以为遇到问题。进行更改后,我们还碰巧升级到了PC,因此我们认为自从NaN停止运行以来,我们所做的更改已将其修复。然后一个月后,我们开始使用那台旧PC进行评估,并再次遇到NaN。那是我发布此内容的时间。不久之后,我意识到可能存在硬件问题。