我正在训练卷积神经网络(CNN),在MNIST上进行X次迭代后,我的训练和验证准确率大幅下降:
X似乎取决于学习率。修改丢失似乎对这种现象没有任何影响。我做了较低报告的测试(每100批报告)并注意到掉落发生得非常快。跌落后准确性无法恢复。
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 10000
training_accuracy / validation_accuracy => 0.9833 / 1.0000 for step 20000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 30000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 40000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 50000
training_accuracy / validation_accuracy => 0.1000 / 0.1000 for step 60000
training_accuracy / validation_accuracy => 0.1000 / 0.1000 for step 69999
我的CNN是典型的CNN,从0开始训练。代码可用here。数据集是标准的MNIST数据集,有两个捕获:
这不会过度拟合,因为训练准确性也会下降。
我注意到在那次下降之后所有预测都是0
。准确度为1/10 = 0.1
(因为CNN始终预测为0)
你知道那是什么现象吗?感谢您的想法和反馈。
更新1: 我注意到所有权重和偏差都填充了nan:
2017-06-10 13:06:34.814975: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc1: [[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan]...]
2017-06-10 13:06:34.830064: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc1: [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan...]
2017-06-10 13:06:34.840501: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc2: [[nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan][nan nan nan nan nan nan nan nan nan nan]...]
2017-06-10 13:06:34.851325: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc2: [nan nan nan nan nan nan nan nan nan nan]
答案 0 :(得分:3)
如果您正在使用交叉熵损失函数,那么一旦您的网络输出0.0的预测,那么您的损失包含log(0),即nan。在Python中,对nan执行的任何操作也都是nan,因此这个nan会快速反向传播到整个网络。在将output = tf.clip_by_value(output, 10e-8, 1.-10e-8)
传递给损失函数之前使用output
。您使用tf.log(y + small_constant)
的解决方案也可以使用。