深造与流失原因

2024-05-29 05:52:37 发布

您现在位置:Python中文网/ 问答频道 /正文

也许这个问题太笼统了,但有谁能解释什么会导致卷积神经网络发散呢?

具体内容:

我正在使用Tensorflow的iris_训练模型和我自己的一些数据,并不断得到

ERROR:tensorflow:Model diverged with loss = NaN.

Traceback...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: NaN loss during training.

回溯源于行:

 tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                        hidden_units=[300, 300, 300],
                                        #optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),                                                          
                                        n_classes=11,
                                        model_dir="/tmp/iris_model")

我试过调整优化器,使用零作为学习率,而没有使用优化器。对网络层、数据大小等的任何洞察都是值得赞赏的。


Tags: columns数据irismodeltftensorflow神经网络nan
3条回答

我看到很多东西使模型发生了偏离。

  1. 学习率太高。如果损失开始增加,然后发散到无穷大,你通常可以判断是否如此。

  2. 我不熟悉DNNClassifier,但我猜它使用了范畴交叉熵代价函数。这涉及到当预测接近于零时,取偏离的预测的对数。这就是为什么人们通常在预测中加入一个小的epsilon值来防止这种差异。我猜DNNClassifier可能会这样做,或者使用tensorflow opp。可能不是这个问题。

  3. 其他的数值稳定性问题也可能存在,比如加上epsilon就可以得到零的除法。另一个不太明显的问题是,在处理有限精度数时,如果不适当简化,求导的平方根会发散。我再次怀疑这是DNNClassifier的问题。

  4. 输入数据可能有问题。尝试对输入数据调用assert not np.any(np.isnan(x)),以确保没有引入nan。还要确保所有目标值都有效。最后,确保数据正确规范化。您可能希望像素的范围是[-1,1]而不是[0,255]。

  5. 标签必须在损失函数的域中,因此如果使用基于对数的损失函数,所有标签都必须是非负的(如evan pu和下面的注释所示)。

如果使用整数作为目标,请确保它们在0处不对称。

也就是说,不要使用类-1,0,1。改为使用0、1、2。

如果你在训练交叉熵,你需要在你的输出概率上加一个小的数字,比如1e-8。

因为log(0)是负无穷大,当你的模型训练足够的时候,输出分布会非常倾斜,比如说我在做一个4类的输出,一开始我的概率看起来像

0.25 0.25 0.25 0.25

但到最后,这种可能性可能看起来像

1.0 0 0 0

你取这个分布的交叉熵,一切都会爆炸。解决方法是人为地在所有术语中添加一个小数字,以防止出现这种情况。

相关问题 更多 >

    热门问题