Tensorflow:损失变为'NaN'

时间:2017-05-13 02:14:07

标签: machine-learning tensorflow deep-learning

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

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

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)

,结果如下所示。

{{1}}

关于NaN损失的任何想法?

3 个答案:

答案 0 :(得分:2)

当你的学习率太高时,这种情况在实践中发生了很多,我倾向于从0.001开始并从那里开始,在大多数数据集中,0.1在非常高的一侧,特别是如果你没有划分你的损失按您的批量大小。

答案 1 :(得分:0)

你可以剪辑渐变,如果你使用带有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)

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

(您可能还想查看渐变剪裁)