【问题标题】:Implementing dropout in my CNN makes Training accuracy drops在我的 CNN 中实施 dropout 会使训练精度下降
【发布时间】:2017-07-02 05:57:51
【问题描述】:

实施卷积神经网络进行图像分类,我的训练集准确率(98%)取得了不错的结果,但测试集准确率仍然很低(大约 82%)。我面临一个过度拟合的问题。 我试图通过实现一个 dropout 函数(保留 50% 的神经元)来解决它,但事实证明,这个解决方案让我的训练准确率下降到了 80%!这是否意味着我的 CNN 中应该有更多的神经元? 我可以做些什么来防止这个问题?

我正在使用 Tensorflow 库,这是训练循环的一段代码:(我不确定我是否正确实现了它)

for epoch in range(22000):
    permutation=np.random.permutation(19600)
    permutation=permutation[0:200]
    batch=[train_set[permutation],train_label[permutation]]
    summary,model,cost=sess.run([merged,train_step,cross_entropy],feed_dict={X:batch[0],Yreal:batch[1],drop_value:0.5}) #training with 50% of the neurons
    train_writer.add_summary(summary,epoch)
    print(cost)
    if epoch%500==0:
        print(epoch)
        summary=sess.run(merged,feed_dict={X:test_set[0:300],Yreal:test_label[0:300],drop_value:1}) #evaluating testing set accuracy using 100% of the neurons
        test_writer.add_summary(summary,epoch)

【问题讨论】:

  • dropout 是不是应该让你的训练准确率下降?毕竟,dropout 意味着你正在使用更小、更不强大的网络进行训练。是什么让你说有问题?
  • 其实你是对的,我不是这么想的。但是如果我想获得好的测试准确率,我必须保持我的训练准确率,对吗?有没有办法在良好的训练准确性和良好的泛化之间取得平衡?我的第一个想法是训练一个功能强大的网络……不确定它是否可以工作。我会在这里尝试并反馈。
  • 在这里回答可能会有所帮助:stackoverflow.com/questions/44695141/…

标签: python-3.x tensorflow conv-neural-network


【解决方案1】:

如果您的测试准确度也与丢失情况下的训练准确度大致相同,那么您可以增加神经元的数量。此外,0.50 作为初始 dropout 相当高。从 0.25 开始(即丢失层保持 0.75 的概率。)。另外,我建议使用一些数据增强,如旋转、扭曲亮度、根据数据的性质交换颜色通道以及使用一些正则化。还绘制学习曲线并检查测试准确度如何随训练准确度变化。

【讨论】:

  • 非常感谢您的回答。事实上,在实施 dropout 之后,训练和测试具有非常相似的学习曲线。正如您所建议的,我将尝试使用其他 drop 值。您建议在哪些层添加神经元?
  • 这是主观的,我会说如果较低的 dropout 不起作用,那么所有层中的神经元都加倍,除了最后一层。
猜你喜欢
  • 2019-06-02
  • 2021-05-14
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2017-01-02
  • 2021-05-14
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多