TensorFlow NaN 仅在恢复模型时输出
TensorFlow NaN in Output Only When Restoring Model
我正在 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")
同样,让我怀疑我的 save/load 例程存在一些问题的事实是,如果我 运行 通过经过训练的网络,网络正在输出有效结果。当我 运行 通过网络加载的东西时,我只会得到 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)
长话短说,如果您的模型中出现 运行dom NaN,并且您已经查看了常见的嫌疑人,请在浪费数百小时之前考虑一下您的硬件可能出现故障的事实。
这是由内存耗尽的视频卡引起的。我以为我们遇到了软件问题,但没想到这一点。培训是在另一台 PC 上进行的,没有遇到任何问题。
这就是我们最终遇到硬件问题的原因。我们之前曾在旧 PC 上经历过 运行domly 发生 NaN。我们花了数百小时调试模型,认为我们遇到了问题。在我们进行更改后,我们也碰巧移动到升级的 PC,所以我们认为我们的更改修复了它,因为 NaN 停止了。然后我们在一个月后使用那台旧 PC 开始 运行 评估,并再次 运行 进入 NaN。那是我发布这个的时候。不久之后,我意识到可能存在硬件问题。
我正在 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")
同样,让我怀疑我的 save/load 例程存在一些问题的事实是,如果我 运行 通过经过训练的网络,网络正在输出有效结果。当我 运行 通过网络加载的东西时,我只会得到 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)
长话短说,如果您的模型中出现 运行dom NaN,并且您已经查看了常见的嫌疑人,请在浪费数百小时之前考虑一下您的硬件可能出现故障的事实。
这是由内存耗尽的视频卡引起的。我以为我们遇到了软件问题,但没想到这一点。培训是在另一台 PC 上进行的,没有遇到任何问题。
这就是我们最终遇到硬件问题的原因。我们之前曾在旧 PC 上经历过 运行domly 发生 NaN。我们花了数百小时调试模型,认为我们遇到了问题。在我们进行更改后,我们也碰巧移动到升级的 PC,所以我们认为我们的更改修复了它,因为 NaN 停止了。然后我们在一个月后使用那台旧 PC 开始 运行 评估,并再次 运行 进入 NaN。那是我发布这个的时候。不久之后,我意识到可能存在硬件问题。