仅在恢复模型时输出中的TensorFlow NaN

时间:2018-06-22 18:56:08

标签: python tensorflow machine-learning batch-normalization

我正在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)

1 个答案:

答案 0 :(得分:0)

长话短说,如果您的模型中出现随机的NaN,并且您已经查看了通常的可疑物,请考虑一下这样的事实:在浪费数百小时之前,硬件可能会发生故障。

这是由内存即将耗尽的视频卡引起的。我以为我们遇到了软件问题,却没有想到这一点。培训是在另一台PC上进行的,没有遇到任何问题。

这是我们最终遇到硬件问题的原因。我们以前曾在旧PC上经历过随机发生的NaN。我们花了数百个小时调试模型,以为遇到问题。进行更改后,我们还碰巧升级到了PC,因此我们认为自从NaN停止运行以来,我们所做的更改已将其修复。然后一个月后,我们开始使用那台旧PC进行评估,并再次遇到NaN。那是我发布此内容的时间。不久之后,我意识到可能存在硬件问题。