Nan在摘要直方图中

时间:2016-10-04 14:03:21

标签: tensorflow

我的程序将面对这个问题(不是每次运行都会遇到这个......),然后如果面对这个我总是可以重现这个错误加载从我在程序崩溃之前保存的最后一个模型由于nan。 当从这个模型重新运行时,第一次训练过程似乎很好,使用模型来产生损失(我有打印损失并且没有问题),但是在应用渐变之后,嵌入变量的值将变为Nan。

那么纳问题的根本原因是什么?感到困惑,因为不知道如何进一步调试,这个程序使用相同的数据和参数将大部分运行正常,只在一些运行期间遇到这个问题..

Loading existing model from: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
Train from restored model: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:245] PoolAllocator: After 5235 get requests, put_count=4729 evicted_count=1000 eviction_rate=0.211461 and unsatisfied allocation rate=0.306781
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:257] Raising pool_size_limit_ from 100 to 110
2016-10-04 21:45:39 epoch:1.87 train_step:18001 duration:0.947 elapsed:0.947 train_avg_metrics:['loss:0.527']  ['loss:0.527']
2016-10-04 21:45:39 epoch:1.87 eval_step: 18001 duration:0.001 elapsed:0.948 ratio:0.001
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
     [[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
     [[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
     [[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
     [[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
     [[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
Traceback (most recent call last):
  File "./train.py", line 308, in <module>
    tf.app.run()

6 个答案:

答案 0 :(得分:10)

有时在训练的初始迭代期间,模型可能只喷出一个预测类。如果没有随机机会,对于所有训练样例,该类结果为0,那么分类交叉熵损失可能存在NaN值。

确保在计算损失时引入一个小值,例如tf.log(predictions + 1e-8)。这将有助于克服这种数值不稳定性。

答案 1 :(得分:7)

通常NaN是模型不稳定的标志,例如,爆炸渐变。它可能会被忽视,损失就会停止萎缩。尝试记录权重摘要会使问题显而易见。我建议你降低学习率作为第一项措施。如果没用,请在此处发布您的代码。没有看到它,很难提出更具体的建议。

答案 2 :(得分:1)

我遇到了类似的错误,并且尝试了不同的学习率,批处理大小,损失函数和模型架构,但是没有任何运气。 但是后来我注意到,如果我不使用张量板回调,则可以很好地训练模型。看起来“摘要直方图中的Nan”是指保存模型权重直方图,从而使那些Nan更加明确。 在张量板回调中关闭直方图为我解决了这个问题: tf.keras.callbacks.TensorBoard(log_dir = log_dir,histogram_freq = 0)

答案 3 :(得分:0)

我相信这与您的系统内存不足有关。如果经过一定数量的步骤后出现错误,这似乎尤其是个问题。

batch_norm (在pipeline.config文件中)中将 train 设置为 false 似乎可以解决此问题。

它应该看起来像这样:

batch_norm {
      decay: 0.999
      center: true
      scale: true
      epsilon: 0.001
      train: false
    }

删除训练目录(logdir),然后再次开始训练。 从最近的检查点恢复将导致相同的错误。

希望这会有所帮助。

答案 4 :(得分:0)

我有一个类似的问题,在我的情况下,我将激活从tf.nn.relu更改为tf.nn.sigmoid,它起作用了。我希望这会有所帮助。

答案 5 :(得分:0)

如果您正在使用tensorflow.keras.layers.Masking,并且批处理中的所有输入都被掩盖了一个或多个输入功能,则可能会出现此错误。

类似于纳吉布·汗(Najeeb Khan)的案子,但触发方式有所不同。

这是有道理的,因为当张量流从_log_weights调用on_epoch_end时,与输入特征相关的权重实际上始终是NaN。

对我来说,解决方案是显式加载权重(通过tensorflow.keras.models.load_model