卷积神经网络过拟合。辍学没有帮助

数据挖掘 深度学习 神经网络 卷积神经网络 图像识别 辍学
2021-10-09 23:18:25

我正在玩一些convnets。具体来说,我正在使用 kaggle 猫对狗数据集,该数据集包含 25000 张标记为猫或狗的图像(每张 12500 张)。

我已经成功地在我的测试集上实现了大约 85% 的分类准确率,但是我设定了实现 90% 准确率的目标。

我的主要问题是过度拟合。不知何故,它总是最终发生(通常在 8-10 纪元之后)。我的网络架构大致受到 VGG-16 的启发,更具体地说,我的图像被调整为128X128X3,然后我运行:

Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool    1 64x64x32   (kernel size is 2, strides is 2)
Convolution 3 64x64x64   (kernel size is 3, strides is 1)
Convolution 4 64x64x64   (kernel size is 3, strides is 1)
Max pool    2 32x32x64   (kernel size is 2, strides is 2)
Convolution 5 16x16x128  (kernel size is 3, strides is 1)
Convolution 6 16x16x128  (kernel size is 3, strides is 1)
Max pool    3 8x8x128    (kernel size is 2, strides is 2)
Convolution 7 8x8x256    (kernel size is 3, strides is 1)
Max pool    4 4x4x256    (kernel size is 2, strides is 2)
Convolution 8 4x4x512    (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)

除最后一层外,所有层都具有 relus 作为激活函数。

请注意,我尝试了不同的卷积组合(我从更简单的卷积开始)。

此外,我通过镜像图像来扩充数据集,因此我总共有 50000 张图像。

另外,我正在使用最小最大归一化对图像进行归一化,其中 X 是图像

X=X-0/255-0

代码用 tensorflow 编写,批量大小为 128。

小批量的训练数据最终会过度拟合,准确率达到 100%,而验证数据似乎在 84-85% 左右停止学习。

我也尝试增加/减少辍学率。

使用的优化器是 AdamOptimizer,学习率为 0.0001

目前我在过去 3 周里一直在解决这个问题,85% 似乎在我面前设置了障碍。

作为记录,我知道我可以使用迁移学习来获得更高的结果,但我对构建这个网络作为一种自学体验很感兴趣。

更新:

我正在运行具有不同批量大小的相同网络,在这种情况下,我使用的批量大小要小得多(16 而不是 128),到目前为止我达到了 87.5% 的准确度(而不是 85%)。也就是说,无论如何,网络最终都会过度拟合。我仍然不明白 50% 的单位辍学是如何无济于事的……显然我在这里做错了什么。有任何想法吗?

更新 2:

似乎问题与批量大小有关,因为使用较小的尺寸(16 而不是 128)我现在在我的测试集上实现了 92.8% 的准确度,较小的批量尺寸网络仍然过拟合(小批量最终精度为 100%)但是,损失(误差)不断减少,并且通常更稳定。缺点是运行时间要慢得多,但完全值得等待。

4个回答

好的,所以经过大量实验后,我设法获得了一些结果/见解。

首先,一切都是平等的,训练集中较小的批次有助于提高网络的总体性能,但不利的一面是,训练过程要慢得多。

第二点,数据很重要,这里没有什么新鲜事,但正如我在解决这个问题时了解到的那样,更多的数据似乎总是有帮助的。

第三点,dropout 在具有大量数据和大量迭代的大型网络中很有用,在我的网络中,我只在最终的全连接层上应用了 dropout,卷积层没有应用 dropout。

第四点(这是我一遍又一遍地学习的东西):神经网络需要很多时间来训练,即使在好的 GPU 上也是如此(我在 floydhub 上训练了这个网络,它使用了非常昂贵的 NVIDIA 卡),所以耐心是关键

最终结论:批量大小比人们想象的更重要,显然,当批量较大时,更容易达到局部最小值。

我编写的代码可用作python notebook,我认为它有很好的文档记录。

我建议您按照 Neil Slater 的建议分析验证准确性的学习图。然后,如果验证准确率下降,请尝试减小网络的大小(似乎太深),将 dropout 添加到 CONV 层并在每层之后添加 BatchNormalization。它可以帮助摆脱过度拟合并提高测试准确性。

您的问题有几种可能的解决方案。

  1. 在较早的层(卷积层)中也使用 Dropout。

  2. 对于这样一个“简单”的任务,您的网络似乎相当大;尝试减少它。大型架构也在更大的数据集上进行训练。

如果您想保持“大”架构,请尝试:

  1. 图像增强以虚拟增加您的训练数据

  2. 尝试对抗性训练。它有时会有所帮助。

还没有提到的一件事,你可以在未来考虑:你仍然可以在全连接层增加你的 dropout。

我曾经读过一篇使用 90% 辍学率的论文。虽然它有很多节点(如果我没记错的话是 2048 个),我自己在节点较少的层上尝试过这个,在某些情况下它非常有用。

我刚查了一下是哪张纸。我不记得我只记得哪篇论文了,但我发现这些论文也取得了一些成功,辍学率达到了 90%。

Karpathy, A.、Toderici, G.、Shetty, S.、Leung, T.、Sukthankar, R. 和 Fei-Fei, L. (2014)。使用卷积神经网络进行大规模视频分类。在 IEEE 计算机视觉和模式识别会议论文集中(第 1725-1732 页)。

Simonyan, K. 和 Zisserman, A. (2014)。用于视频中动作识别的两流卷积网络。在神经信息处理系统的进展中(第 568-576 页)。

Varol, G.、Laptev, I. 和 Schmid, C. (2017)。用于动作识别的长期时间卷积。IEEE 模式分析和机器智能交易。