深度学习Nan损失原因

问题描述 投票:46回答:6

也许太笼统了,但是谁能解释导致卷积神经网络发散的原因?

具体:

我正在将Tensorflow的iris_training模型与我自己的一些数据一起使用,并不断获取

错误:tensorflow:模型因损失= NaN而发散。

追踪...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError:训练期间NaN丢失。

追溯源自行:

 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")

我尝试过调整优化器,将学习率设置为零,并且不使用优化器。任何对网络层,数据大小等的见解都值得赞赏。

python tensorflow machine-learning keras theano
6个回答
76
投票

我见过很多东西使模型有所不同。

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

  2. 我不熟悉DNNClassifier,但是我猜想它使用了分类交叉熵代价函数。这涉及获取预测的对数,该对数随着预测接近零而发散。这就是为什么人们通常在预测中添加较小的ε值以防止这种差异。我猜测DNNClassifier可能会这样做或使用tensorflow opp。可能不是问题。

  3. 可能存在其他数值稳定性问题,例如除以零会增加epsilon的作用。如果在处理有限精度数时未适当简化,则导数的平方根可以发散的另一种不那么明显的方法。我再次怀疑这是DNNClassifier的问题。

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

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

如果您正在训练交叉熵,则希望在输出概率中添加一个小数,例如1e-8。

因为log(0)为负无穷大,当您的模型经过足够的训练后,输出分布将非常偏斜,例如说我正在执行4类输出,一开始我的机率就好像]

0.25 0.25 0.25 0.25

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

1.0 0 0 0

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

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

即,不要使用-1、0、1类。而应使用0、1、2类。

就我而言,设置远距离整数标签时得到NAN。即:

  • 标签[0..100]培训还可以,
  • 标签[0..100]加上一个附加标签8000,然后我得到了NAN。
  • 因此,请不要使用距离太远的标签。

    编辑您可以在以下简单代码中看到效果:

    from keras.models import Sequential
    from keras.layers import Dense, Activation
    import numpy as np
    
    X=np.random.random(size=(20,5))
    y=np.random.randint(0,high=5, size=(20,1))
    
    model = Sequential([
                Dense(10, input_dim=X.shape[1]),
                Activation('relu'),
                Dense(5),
                Activation('softmax')
                ])
    model.compile(optimizer = "Adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )
    
    print('fit model with labels in range 0..5')
    history = model.fit(X, y, epochs= 5 )
    
    X = np.vstack( (X, np.random.random(size=(1,5))))
    y = np.vstack( ( y, [[8000]]))
    print('fit model with labels in range 0..5 plus 8000')
    history = model.fit(X, y, epochs= 5 )
    

    结果显示添加标签8000后的NAN:

    fit model with labels in range 0..5
    Epoch 1/5
    20/20 [==============================] - 0s 25ms/step - loss: 1.8345 - acc: 0.1500
    Epoch 2/5
    20/20 [==============================] - 0s 150us/step - loss: 1.8312 - acc: 0.1500
    Epoch 3/5
    20/20 [==============================] - 0s 151us/step - loss: 1.8273 - acc: 0.1500
    Epoch 4/5
    20/20 [==============================] - 0s 198us/step - loss: 1.8233 - acc: 0.1500
    Epoch 5/5
    20/20 [==============================] - 0s 151us/step - loss: 1.8192 - acc: 0.1500
    fit model with labels in range 0..5 plus 8000
    Epoch 1/5
    21/21 [==============================] - 0s 142us/step - loss: nan - acc: 0.1429
    Epoch 2/5
    21/21 [==============================] - 0s 238us/step - loss: nan - acc: 0.2381
    Epoch 3/5
    21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
    Epoch 4/5
    21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
    Epoch 5/5
    21/21 [==============================] - 0s 188us/step - loss: nan - acc: 0.2381
    

    如果您想收集有关该错误的更多信息,并且如果该错误是在前几次迭代中发生的,则建议您在仅CPU模式(无GPU)下运行实验。该错误信息将更加具体。

    来源:https://github.com/tensorflow/tensor2tensor/issues/574

    正规化可以提供帮助。对于分类器,无论是二进制分类器还是多分类器,都有很好的活动正则化条件。对于回归器,内核正则化可能更合适。


    8
    投票

    如果您正在训练交叉熵,则希望在输出概率中添加一个小数,例如1e-8。


    3
    投票

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


    3
    投票

    就我而言,设置远距离整数标签时得到NAN。即:


    1
    投票

    如果您想收集有关该错误的更多信息,并且如果该错误是在前几次迭代中发生的,则建议您在仅CPU模式(无GPU)下运行实验。该错误信息将更加具体。


    0
    投票

    正规化可以提供帮助。对于分类器,无论是二进制分类器还是多分类器,都有很好的活动正则化条件。对于回归器,内核正则化可能更合适。

    © www.soinside.com 2019 - 2024. All rights reserved.