使用张量流训练神经网络一段时间后生成Nans

时间:2017-03-24 04:59:37

标签: python tensorflow neural-network

我几天后就遇到了这个问题。我不知道我在哪里弄错了。我的代码很冗长,无法在这里重现所有内容

以下是第一种情况的结果:

Accuracy: 0.1071 Error: 1.45003
Accuracy: 0.5149 Error: 0.259084
Accuracy: 0.7199 Error: 0.197301
Accuracy: 0.7934 Error: 0.138881
Accuracy: 0.8137 Error: 0.136115
Accuracy: 0.8501 Error: 0.15382
Accuracy: 0.8642 Error: 0.100813
Accuracy: 0.8761 Error: 0.0882854
Accuracy: 0.882 Error: 0.0874575
Accuracy: 0.8861 Error: 0.0629579
Accuracy: 0.8912 Error: 0.101606
Accuracy: 0.8939 Error: 0.0744626
Accuracy: 0.8975 Error: 0.0775732
Accuracy: 0.8957 Error: 0.0909776
Accuracy: 0.9002 Error: 0.0799101
Accuracy: 0.9034 Error: 0.0621196
Accuracy: 0.9004 Error: 0.0752576
Accuracy: 0.9068 Error: 0.0531508
Accuracy: 0.905 Error: 0.0699344
Accuracy: 0.8941 Error: nan
Accuracy: 0.893 Error: nan
Accuracy: 0.893 Error: nan

我尝试了各种各样的事情,却未能弄清楚我犯了什么错误。

1)将交叉熵计算改为不同的事物

self._error = -tf.reduce_sum(y*pred+ 1e-9))
self._error = -tf.reduce_sum(y*pred)
self._error = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=y))
self._error = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred+1e-8),reduction_indices=1))

out = tf.nn.softmax_cross_entropy_with_logits(logits = pred, labels=y)
self._error= tf.reduce_mean(out)

我尝试过所有优化器 - sgd - 亚当 - 阿德格拉德 - rmsprop

我使用了tensorflow提供的默认优化器并手动应用了不同的参数。要点我甚至检查学习率小到0.00001

偏压:
我试过1.0和0.0

重量:
使用tf.truncated_normal_initializer初始化(stddev = 0.1,dtype = tf.float32)

网络
FC784 - FC256 - FC128 - FC10
我也尝试了不同的变种。

激活功能:
- Relu - Tanh - 泄漏relu tf.maximum(输入,0.1 *输入)

数据:
MNIST数据集通过将其除以255来归一化。数据集来自Keras。

我知道这个问题在各种stackoverflow问题中被问到,我已经尝试了所有建议的方法,据我所知,他们都没有帮助过我。

2 个答案:

答案 0 :(得分:0)

从上面的信息来看,很难说出现了什么问题。是的,调试神经网络可能非常繁琐。幸运的是,Tensorflow Debugger是一个很棒的工具,它允许您在每次迭代时逐步浏览网络并分析权重。

在tfdbg中运行以下命令,以获取图表中显示的第一个naninf值。

run -f has_inf_or_nan

答案 1 :(得分:0)

确保您的标签不超过softmax输出数 -1 。在这种情况下,warning: reference to local variable ‘asd’ returned会产生NaN而不是引发错误。通常,如果标签的范围是1..N,但softmax索引从0..N-1

运行,则会发生这种情况。