首页 文章

卷积神经网络(CNN)中的训练和验证精度突然下降

提问于
浏览
0

我正在训练卷积神经网络(CNN),我在MNIST的X迭代后经历了训练和验证准确性的显着下降:
Steps vs. accuracy

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]

1 回答

  • 2

    如果您正在使用交叉熵损失函数,那么一旦您的网络输出0.0的预测,那么您的损失包含log(0),即nan . 在Python中,对nan执行的任何操作也都是nan,因此这个nan会快速反向传播到整个网络 . 在将 output 传递给loss函数之前使用 output = tf.clip_by_value(output, 10e-8, 1.-10e-8) . 您使用 tf.log(y + small_constant) 的解决方案也可以使用 .

相关问题