当前位置: 首页 > 知识库问答 >
问题:

深度学习南部损失原因

狄天逸
2023-03-14

也许这是一个过于笼统的问题,但谁能解释什么会导致卷积神经网络发散?

规格:

我正在使用Tensorflow的iris_training模型和我自己的一些数据,并不断获得

错误:张量流:模型因损失=NaN而发散。

追踪。。。

tensor flow . contrib . learn . python . learn . monitors . nanlosduring training error:训练时的NaN损耗。

Traceback源自行:

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

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

共有3个答案

秦宜修
2023-03-14

在我的例子中,当设置远程整数标签时,我得到了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
史弘博
2023-03-14

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

因为 log(0) 是负无穷大,所以当你的模型训练得足够多时,输出分布将非常偏斜,例如,假设我正在做一个 4 类输出,一开始我的概率看起来像

0.25 0.25 0.25 0.25

但到最后,概率可能会是这样的

1.0 0 0 0

对这个分布求交叉熵,一切都会爆炸。解决办法是人为地在所有术语中添加一个小数字来防止这种情况。

唐修能
2023-03-14

我所看到的很多事情都会使模型产生分歧。

>

  • 学习率太高。如果损失开始增加,然后发散到无穷大,您通常可以判断是否是这种情况。

    我不熟悉DNN分类器,但我猜它使用分类交叉熵代价函数。这涉及获取预测的日志,当预测接近零时,该日志会发散。这就是为什么人们通常会在预测中添加一个小的ε值以防止这种发散。我猜DNN分类器可能会这样做或使用张量流opp。可能不是问题所在。

    可能存在其他数值稳定性问题,例如除以零,其中添加 epsilon 可能会有所帮助。另一个不太明显的问题,即在处理有限精度数时,如果没有得到适当的简化,则导数的平方根可以发散。然而,我再次怀疑这是DNN分类器的问题。

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

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

  •  类似资料:
    • 问题内容: 也许这个问题太笼统,但是谁能解释导致卷积神经网络发散的原因是什么? 细节: 我正在使用Tensorflow的iris_training模型处理一些自己的数据,并不断获取 错误:张量流:模型因损失= NaN而发散。 追溯… tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError:训练期间NaN丢失

    • 主要内容 课程列表 专项课程学习 辅助课程 论文专区 课程列表 课程 机构 参考书 Notes等其他资料 卷积神经网络视觉识别 Stanford 暂无 链接 神经网络 Tweet 暂无 链接 深度学习用于自然语言处理 Stanford 暂无 链接 自然语言处理 Speech and Language Processing 链接 专项课程学习 下述的课程都是公认的最好的在线学习资料,侧重点不同,但推

    • Google Cloud Platform 推出了一个 Learn TensorFlow and deep learning, without a Ph.D. 的教程,介绍了如何基于 Tensorflow 实现 CNN 和 RNN,链接在 这里。 Youtube Slide1 Slide2 Sample Code

    • 现在开始学深度学习。在这部分讲义中,我们要简单介绍神经网络,讨论一下向量化以及利用反向传播(backpropagation)来训练神经网络。 1 神经网络(Neural Networks) 我们将慢慢的从一个小问题开始一步一步的构建一个神经网络。回忆一下本课程最开始的时就见到的那个房价预测问题:给定房屋的面积,我们要预测其价格。 在之前的章节中,我们学到的方法是在数据图像中拟合一条直线。现在咱们不

    • 深度学习的总体来讲分三层,输入层,隐藏层和输出层。如下图: 但是中间的隐藏层可以是多层,所以叫深度神经网络,中间的隐藏层可以有多种形式,就构成了各种不同的神经网络模型。这部分主要介绍各种常见的神经网络层。在熟悉这些常见的层后,一个神经网络其实就是各种不同层的组合。后边介绍主要基于keras的文档进行组织介绍。

    • Python 是一种通用的高级编程语言,广泛用于数据科学和生成深度学习算法。这个简短的教程介绍了 Python 及其库,如 Numpy,Scipy,Pandas,Matplotlib,像 Theano,TensorFlow,Keras 这样的框架。