首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深造南损失的原因

深造南损失的原因
EN

Stack Overflow用户
提问于 2016-10-14 19:07:18
回答 13查看 197.1K关注 0票数 137

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

具体情况:

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

错误:tensorflow:模型发散,损耗= NaN。 追溯..。 tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: NaN在训练中丢失。

追溯起源于line:

代码语言:javascript
复制
 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")

我尝试过调整优化器,使用零作为学习速率,而不使用优化器。任何对网络层,数据大小等的洞察力都将受到欢迎。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2016-11-05 02:52:43

我见过很多东西使模特们产生了分歧。

  1. 学习率太高了。如果损失开始增加,然后发散到无穷大,你通常可以判断是否是这样。
  2. 我不太熟悉DNNClassifier,但我猜它使用的是绝对交叉熵代价函数。这涉及到获取预测的日志,当预测接近于零时,预测就会发散。这就是为什么人们通常在预测中增加一个小的epsilon值来防止这种差异。我猜DNNClassifier可能会这样做,或者使用tensorflow选项。可能不是问题所在。
  3. 其他数值稳定性问题可能存在,如除以零,其中添加epsilon可以帮助。另一个不太明显的问题是,如果其导数可以发散的平方根,如果在处理有限精度数时不能适当地简化。我再次怀疑这是DNNClassifier的情况下的问题。
  4. 输入数据可能有问题。尝试对输入数据调用assert not np.any(np.isnan(x)),以确保没有引入nan。还要确保所有目标值都是有效的。最后,确保数据是正确规范化的。您可能希望在-1,1,而不是0,255范围内的像素。
  5. 标签必须在损失函数的范围内,所以如果使用基于对数的损失函数,所有标签都必须是非负的(如evan和下面的注释所指出的)。
票数 187
EN

Stack Overflow用户

发布于 2017-07-27 00:45:00

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

因为log(0)是负无穷大,当您的模型经过足够的训练,输出分布将非常倾斜,例如,假设我正在执行一个4类输出,在开始时,我的概率看起来就像

代码语言:javascript
复制
0.25 0.25 0.25 0.25

但到了最后,概率很可能会像

代码语言:javascript
复制
1.0 0 0 0

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

票数 20
EN

Stack Overflow用户

发布于 2019-02-03 09:14:27

在我的例子中,当设置远距离整数标签时,我得到了NAN。ie:

  • 标签0..100训练没问题,
  • 标签0..100再加上一个额外的标签8000,然后我得到了NANs。

所以,不要用很远的标签。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40050397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档