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。那是我发布这个的时候。不久之后,我意识到可能存在硬件问题。