我正在玩一些convnets。具体来说,我正在使用 kaggle 猫对狗数据集,该数据集包含 25000 张标记为猫或狗的图像(每张 12500 张)。
我已经成功地在我的测试集上实现了大约 85% 的分类准确率,但是我设定了实现 90% 准确率的目标。
我的主要问题是过度拟合。不知何故,它总是最终发生(通常在 8-10 纪元之后)。我的网络架构大致受到 VGG-16 的启发,更具体地说,我的图像被调整为,然后我运行:
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 是图像
代码用 tensorflow 编写,批量大小为 128。
小批量的训练数据最终会过度拟合,准确率达到 100%,而验证数据似乎在 84-85% 左右停止学习。
我也尝试增加/减少辍学率。
使用的优化器是 AdamOptimizer,学习率为 0.0001
目前我在过去 3 周里一直在解决这个问题,85% 似乎在我面前设置了障碍。
作为记录,我知道我可以使用迁移学习来获得更高的结果,但我对构建这个网络作为一种自学体验很感兴趣。
更新:
我正在运行具有不同批量大小的相同网络,在这种情况下,我使用的批量大小要小得多(16 而不是 128),到目前为止我达到了 87.5% 的准确度(而不是 85%)。也就是说,无论如何,网络最终都会过度拟合。我仍然不明白 50% 的单位辍学是如何无济于事的……显然我在这里做错了什么。有任何想法吗?
更新 2:
似乎问题与批量大小有关,因为使用较小的尺寸(16 而不是 128)我现在在我的测试集上实现了 92.8% 的准确度,较小的批量尺寸网络仍然过拟合(小批量最终精度为 100%)但是,损失(误差)不断减少,并且通常更稳定。缺点是运行时间要慢得多,但完全值得等待。