我的卷积神经网络过拟合



最近,我构建了一个简单的卷积神经网络,用于手势图像识别,使用背景减法使手在屏幕上成为黑色背景的白色形状。它大部分是使用keras Conv2D构建的。我的数据集有 1000 张用于训练的图片和 100 张用于验证和测试的图片。奇怪的是,这个问题在第一个纪元之后立即发生,在此期间,模型的损失下降了很多。它通常在第二个纪元开始时从像 183 这样的大数字下降到 1。数据集中的所有图片都来自我自己使用 cv2 的手,但我只用自己的手进行了测试,所以这应该没有任何问题。如果数据集有问题,我尝试采用 3 个不同的数据集,其中一个使用 cv2 的 Canny 方法,该方法基本上描绘了一条手线,并使图片的其余部分变黑,看看这是否有区别。无论如何,同样的事情继续发生。此外,我在不同的地方添加了多个 Dropout 层以查看效果,并且总是发生同样的事情,其中损失急剧减少并显示出过度拟合的迹象。我还实现了 EarlyStop 和多层,看看这是否有帮助,但相同的结果似乎总是会发生。

model = Sequential()
model.add(Conv2D(32, (3,3), activation = 'relu',
input_shape = (240, 215, 1)))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), activation = 'relu'))
model.add(Conv2D(64, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(256, (3,3), activation = 'relu'))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.25))
#model.add(Conv2D(256, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
#model.add(Conv2D(128, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
#model.add(Conv2D(64, (3,3), activation = 'relu'))
#model.add(MaxPooling2D((2,2)))
model.add(Flatten())
model.add(Dense(150, activation = 'relu'))
#model.add(Dropout(0.25))
#model.add(Dense(1000, activation = 'relu'))
model.add(Dropout(0.75))
model.add(Dense(6, activation = 'softmax'))
model.summary()
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy',
metrics = ['acc'])
callbacks_list = [EarlyStopping(monitor = 'val_loss', patience = 10),
ModelCheckpoint(filepath = 'model.h6', monitor = 'val_loss',
save_best_only = True),]

代码的注释部分是我尝试实现的更改。我还对 Dropout 的值和位置进行了很大的更改,没有任何重大变化。谁能提供任何建议,为什么我的模型这么快过度拟合?

是的,这是一个明显的过度拟合案例。以下是我的建议:

  1. 尝试减少隐藏层
  2. 将辍学增加到 0.5
  3. 创建更多合成图像或对原始图像应用转换。

在处理如此大规模的过拟合现象时,一个好的起点是减少层数。

尽管在多次最大池化后添加了Dropout,但仍然会出现过拟合现象。

下面我提出我的一些建议:

  1. 确保您有一个带有干净标签的综合数据集。 无论我们想要如何调整神经网络,如果 数据集不干净,我们无法获得好的结果。
  2. 添加(开始(,最多 3 堆栈卷积 + max_pooling + dropout。(32 + 64 + 128( 将是一个很好的开始 点。
  3. 使用GlobalAveragePooling2D而不是Dense图层。卷积神经网络不需要后者,除了 最后一层带有sigmoidsoftmax
  4. 尝试使用SpatialDropout2D.与典型的Dropout相比,这是 应用于特征图中的每个元素,SpatialDropout 会删除整个特征图。
  5. 尝试使用数据增强。通过这种方式,您可以创建更多的人工示例,并且您的网络将不那么容易过度拟合。
  6. 如果这些都不起作用,请确保您使用预先训练的网络,并将迁移学习应用于手头的任务。

最新更新