即使在简单的架构和大量数据中,我的CNN也过度拟合



我为多标签图像(不同鞋子(创建了一个CNN,它们的大小为100x100x3。我有 50000 张图像,有 5 个类(我认为这已经足够了(,但问题是,在训练时:

  • 测试精度和验证精度在开始时一起上升,但Val acc几乎恒定在约58%,并且列车acc继续增加到约85-99%。

  • 似乎过度拟合,我尝试使用辍学、l1 正则化等。

这是我的架构。这可能有什么问题?

**Conv Layer , 16 ,(3,3), input =100,100,3 ,padding = same**
**LeakyRelu and MaxPooling()**
**Dropouts **
**Conv layer , 32, (9,9), pd = same** 
**LeakyRelu and maxpooling()**
**Dropouts**
**Flatten()**
**Dense 5, leakyRelu, l1(0.001), dropout**
**Dense 5, leakyRelu,l1(0.001)**
**Sigmoid**

您可以尝试以下几种方法:

  • 大小9x9的滤镜并不常见,当然不适用于如此小的图像。在这种情况下,我会使用3x3
  • 您是否尝试过仅使用 ReLU 而不是其泄漏版本?我认为最好从非线性的简单版本开始,然后再尝试不同的版本,看看哪个表现最好(以及是否有任何差异(
  • 我会放弃 L1 正则化,稍后再添加它们以查看它们是否有帮助。在尝试获得最先进的结果之前,首先尝试获得合理的结果
  • 目前,每层之后您都会辍学,这对我来说似乎很多。也许您可以尝试删除第一个?另外:你的辍学率是多少?
  • 每个卷积层之后都有一个池化层,您是否尝试过删除第一个?与辍学一样,您似乎过度使用了池化层。
  • 您的第一个全连接(密集(层的节点很少。请注意,Flatten()层的输出是 20000 维的(两次池化 ->100/2/2 x 100/2/2 x 32 = 20000(,因此在平展层和最后一个全连接层之间的层中使用大量节点会更有意义。我建议尝试 1024 甚至 256 我会更好。

此外,您的卷积层也很少。即使对于 CIFAR-10 数据集(10 个类的 60000 张大小为32x32x3的图像(,我也会使用至少 2 个块,每个块有 2 个卷积层,如下所示:

input(32, 32, 3)
conv_2D(32, (3,3), activation='relu', padding='same')
conv_2D(32, (3,3), activation='relu', padding='same')
dropout(0.25)
maxpooling
conv_2D(64, (3,3), activation='relu', padding='same')
conv_2D(64, (3,3), activation='relu', padding='same')
dropout(0.25)
maxpooling
flatten
dense(1024, activation='relu')
dense(10, activation='sigmoid')

最新更新