也许这是一个过于笼统的问题,但谁能解释什么会导致卷积神经网络发散?
规格:
我正在使用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")
我尝试过调整优化器,使用零作为学习速率,而不使用优化器。任何对网络层,数据大小等的见解都是值得赞赏的。
在我的例子中,当设置远程整数标签时,我得到了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
如果你在训练交叉熵,你需要在输出概率中加上一个像1e-8这样的小数字。
因为 log(0) 是负无穷大,所以当你的模型训练得足够多时,输出分布将非常偏斜,例如,假设我正在做一个 4 类输出,一开始我的概率看起来像
0.25 0.25 0.25 0.25
但到最后,概率可能会是这样的
1.0 0 0 0
对这个分布求交叉熵,一切都会爆炸。解决办法是人为地在所有术语中添加一个小数字来防止这种情况。
我所看到的很多事情都会使模型产生分歧。
>
学习率太高。如果损失开始增加,然后发散到无穷大,您通常可以判断是否是这种情况。
我不熟悉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 这样的框架。