Tensorflow:损失变成'NaN'

Posted

技术标签:

【中文标题】Tensorflow:损失变成\'NaN\'【英文标题】:Tensorflow: loss becomes 'NaN'Tensorflow:损失变成'NaN' 【发布时间】:2017-10-12 09:55:20 【问题描述】:

我正在使用 Tensorflow 在 CPU 上进行 CIFAR-10 培训。在前几轮比赛中,输球似乎还不错。但是在步骤 10210 之后,损失会发生变化并最终变为 NaN。

我的网络模型是他们网站上的 CIFAR-10 CNN 模型。这是我的设置,

image_size = 32
num_channels = 3
num_classes = 10
num_batches_to_run = 50000
batch_size = 128
eval_batch_size = 64
initial_learning_rate = 0.1
learning_rate_decay_factor = 0.1
num_epochs_per_decay = 350.0
moving_average_decay = 0.9999

结果如下图。

2017-05-12 21:53:05.125242: step 10210, loss = 4.99 (124.9 examples/sec; 1.025 sec/batch)
2017-05-12 21:53:13.960001: step 10220, loss = 7.55 (139.5 examples/sec; 0.918 sec/batch)
2017-05-12 21:53:23.491228: step 10230, loss = 6.63 (149.5 examples/sec; 0.856 sec/batch)
2017-05-12 21:53:33.355805: step 10240, loss = 8.08 (113.3 examples/sec; 1.129 sec/batch)
2017-05-12 21:53:43.007007: step 10250, loss = 7.18 (126.7 examples/sec; 1.010 sec/batch)
2017-05-12 21:53:52.650118: step 10260, loss = 16.61 (138.0 examples/sec; 0.928 sec/batch)
2017-05-12 21:54:02.537279: step 10270, loss = 9.60 (137.6 examples/sec; 0.930 sec/batch)
2017-05-12 21:54:12.390117: step 10280, loss = 46526.25 (145.5 examples/sec; 0.880 sec/batch)
2017-05-12 21:54:22.060741: step 10290, loss = 133479743509972411931057146822656.00 (130.4 examples/sec; 0.982 sec/batch)
2017-05-12 21:54:31.691058: step 10300, loss = nan (115.8 examples/sec; 1.105 sec/batch)

关于 NaN 损失的任何想法?

【问题讨论】:

你能不能把你的学习率降低到 0.01 或 0.001 看看效果如何? 你的学习率太大了,降低吧。 这个问题在这里得到了很好的回答:***.com/questions/40050397/… 【参考方案1】:

你可以剪裁渐变,如果你使用的是带有 Tensorflow 后端的 Keras,你可以这样做,

参数clipnorm和clipvalue可以与所有优化器一起使用来控制渐变裁剪:

 from keras import optimizers

 # All parameter gradients will be clipped to
 # a maximum norm of 1.
 sgd = optimizers.SGD(lr=0.01, clipnorm=1.)

 from keras import optimizers
 # All parameter gradients will be clipped to
 # a maximum value of 0.5 and
 # a minimum value of -0.5.
 sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)

【讨论】:

【参考方案2】:

当你的学习率太高时,这种情况在实践中经常发生,我倾向于从 0.001 开始并从那里移动,0.1 在大多数数据集上处于非常高的一侧,特别是如果你不将损失除以你的批量大小。

【讨论】:

【参考方案3】:

你可能有交叉熵损失并取 log(0)。只需在日志中添加一个小常量。

(您可能还想研究渐变剪裁)

【讨论】:

以上是关于Tensorflow:损失变成'NaN'的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 打印的损失是批量/样本损失还是运行平均损失?

TensorFlow:执行此损失计算

报告训练数据集中特定样本的训练损失,而不是训练过程中的平均损失 (TensorFlow)

使用 TensorFlow 实现联合损失的交集

Tensorflow 均方误差损失函数

TensorFlow 多个损失值