【问题标题】:Training and validation accuracy suddenly drops in convolutional neural network (CNN)卷积神经网络 (CNN) 的训练和验证准确度突然下降
【发布时间】:2017-11-12 15:09:27
【问题描述】:

我正在训练卷积神经网络 (CNN),在 MNIST 上进行 X 次迭代后,我的训练和验证准确度显着下降:

X 似乎取决于学习率。修改 dropouts 似乎对该现象没有任何影响。我用较低的报告进行了测试(每 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: 我注意到所有的 tf 权重和偏差都用 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]

【问题讨论】:

  • NaNs 意味着损失爆炸了,你的学习率可能太高了。
  • 我认为损失不会激增。它正在慢慢变为 0。还是我误解了你?
  • 我在日志函数中添加了常量,可能会有所帮助:tf.log(y + small_constant).
  • 您能否使用捕获您编辑的输出的日志语句推送代码?
  • 代码链接已损坏。请在此处或某个永久位置添加代码

标签: machine-learning computer-vision deep-learning conv-neural-network


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2017-11-17
    • 2020-09-10
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多