【问题标题】:Oscillating accuracy of CNN training with Tensor Flow for MNIST handwritten digits使用 Tensor Flow 对 MNIST 手写数字进行 CNN 训练的振荡精度
【发布时间】:2017-03-02 14:00:16
【问题描述】:

我正在学习教程“Deep MNIST for Experts”,https://www.tensorflow.org/versions/r0.11/tutorials/mnist/pros/index.html#deep-mnist-for-experts

使用卷积神经网络,我得到了 93.49% 的准确率。这实际上很低,我正在努力改进它,但我有疑问。根据教程,

for i in range(20000):
   batch = mnist.train.next_batch(50)
   if i%100 == 0:
       train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
       print("step %d, training accuracy %g"%(i, train_accuracy))
   train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

每 100 次迭代后记录一次训练的准确度,看到准确度,它会不断波动,就像增加然后减少一样。

step 100, training accuracy 0.1
step 200, training accuracy 0.13
step 300, training accuracy 0.12
step 400, training accuracy 0.08
step 500, training accuracy 0.12
step 600, training accuracy 0.05
step 700, training accuracy 0.09
step 800, training accuracy 0.1
step 900, training accuracy 0.12
step 1000, training accuracy 0.09
step 1100, training accuracy 0.11
step 1200, training accuracy 0.09
step 1300, training accuracy 0.11
step 1400, training accuracy 0.06
step 1500, training accuracy 0.09
step 1600, training accuracy 0.14
step 1700, training accuracy 0.07
step 1800, training accuracy 0.08
......
step 19800, training accuracy 0.14
step 19900, training accuracy 0.07

有什么理由吗?还是正常?那为什么会这样?另外,我可以改变什么样的变量来提高最终的准确性?我已经尝试过更改学习率变量。

【问题讨论】:

    标签: python tensorflow mnist


    【解决方案1】:

    振荡精度通常是由太高的learning_rate 引起的。 我的第一个建议确实是降低 learning_rate,您是否在 对数尺度 上测试了多个学习率,例如0.1,0.05,0.02,0.01,0.005,0.002,...?

    使用大幅较小的学习率应该会消除振荡精度。还要检查 Kaggle 上的 this answerlinked document 以获得更好的理解。

    编辑:

    根据评论中的备注:此准确度是按批次测量的。由于您每次都在比较不同批次的准确性(简单批次与较难批次),因此您不会单调提高准确性是正常的。 您可以进一步减少振荡:

    • 通过增加batch size,波动应该会减少:不同示例难度的影响将被平均化。

    • 您还可以计算一组恒定示例的训练准确度:

      • 使用验证集

      • 平均一个时期内所有批次的批次准确度

      • 实际计算每个训练步数后训练集中所有示例的准确度。如果你有一个大的训练集,这个课程对训练时间有很大的影响。

    【讨论】:

    • 实际上,我正在使用速率为 1e-5 的 adamoptimizer,任何更低或更高,最终精度似乎都会降低。建议这些链接可能是由于批量大小。所以,我也会改变批量大小。
    • 另外,我想知道,如果通常记录的每个步骤的准确性应该不断增加,或者这种振荡是正常的?
    • 是的,批次准确性出现这些波动是正常的。您每次都在不同数据集上测量准确性。如果将其平均,您会得到一个好主意,但现在比较在不同数据集上计算的准确度有点困难。最好还有一个单独的常量验证来计算准确性。您还可以做的是平均一个时期内的所有批次准确度,并且每个时期仅显示该平均值一次...
    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 2021-08-11
    • 2017-01-02
    • 2021-05-14
    • 2017-09-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多