【问题标题】:CNN in Keras: unexpected drop of accuracy for small batch sizesKeras 中的 CNN:小批量的准确性意外下降
【发布时间】:2017-07-30 10:01:27
【问题描述】:

我对一个简单的 CNN(基于来自 Keras Github 存储库的示例脚本)有疑问,我试图用它复制(使用 Keras)Michael Nielsen 的深度学习在线书籍第 6 章中的一个实验(其中他使用了普通的 Theano)。我使用了他的超参数,即batch_size = 10nb_epoch = 60,但使用relu 而不是sigmoid 作为激活函数。他的实现达到了 99.06% 的准确率。令我惊讶的是,我的程序的准确率低于 10%,更令我惊讶的是,当我使用 batch_size = 15 或更高版本(我尝试了 TensorflowTheano)时,准确率合理地 > 98%。对于 Python 代码,请参见 link。 我的代码有问题还是Keras 的“功能”?

【问题讨论】:

标签: python machine-learning neural-network keras conv-neural-network


【解决方案1】:

你使用的batch_size 真的很小。此外 - 您没有使用任何额外的优化器功能(例如momentum),这在这种情况下可能会真正损害您的训练。要了解最可能发生的情况,请尝试了解在您的培训中实际发生的情况:

  1. 每个训练过程都希望减少训练集 X 上的误差,为此,您正在计算此数据集 w.r.t 上的误差梯度。到参数,然后 - 将它们更改为使您的错误更小的方向。
  2. 在整个数据集上计算梯度可能非常昂贵 - 所以不是这样 - 优化器在数据集的一部分(称为 batch,大小为 batch_size)上计算此梯度的近似值,并使用它来更改参数。
  3. 现在尝试想象您有一小部分样本被错误分类 - 或者非常奇怪的情况,导致梯度指向与大多数样本不同的方向。在这种情况下 - 当batch_size 很小时 - 这可能会使这个异常值对你的训练产生更大的影响。在较大批次的情况下 - 正常 样本可以消除这种影响。
  4. 您的网络相对较浅 - 相信并经过经验证明 - 这样的网络可能会遭受所谓的可怜的最小值,您的网络会卡在一个区域中 - 每次更改都会增加错误(反向传播是在这种情况下不起作用)-甚至随机化也无法将您的参数移出该区域。如果您的训练更加混乱 - 您最终最低的可能性往往会更大。

增加batch_size 会使您的网络变得更好,这并不奇怪。为了防止您的网络受到带有小batch_size普通梯度下降的不利影响,您也可以尝试momentum(带有nesterov)或将您的网络深度增加到@987654330 @因为人们相信这样的网络受可怜的最小值的影响较小。

【讨论】:

  • 我理解batch_size可能太小了。但是,我不明白分别使用Keras 和纯Theano 实现的结果之间的区别。
  • 您可以尝试重新开始训练几次。可能是因为keras 在训练期间正在对数据集进行洗牌。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2018-10-23
相关资源
最近更新 更多