python - 我的卷积神经网络过度拟合
问题描述
最近,我建立了一个简单的卷积神经网络,用于手势图像识别,使用背景减法,使手在屏幕上变成黑色背景的白色形状。它大部分是使用 keras Conv2D 构建的。我的数据集有 1000 张用于训练的图片和 100 张用于验证和测试的图片。奇怪的是,这个问题在第一个 epoch 之后立即出现,在此期间模型的损失下降了很多。在第二个纪元开始时,它通常会从 183 之类的大数字下降到 1。数据集中的所有图片都是我自己使用cv2制作的,但我只是用自己的手进行了测试,所以应该没有任何问题。如果数据集是问题,我尝试采用 3 个不同的数据集,一个使用 cv2 的 Canny 方法,它基本上追踪了一条手线并使图片的其余部分变黑,看看这是否有所不同。无论如何,同样的事情继续发生。此外,我在不同的地方添加了多个 Dropout 层以查看效果,并且总是发生相同的事情,其中损失急剧减少并且显示出过度拟合的迹象。我还实现了 EarlyStopping 和多层,看看是否有帮助,但似乎总是会出现相同的结果。
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 值和位置进行了很大的更改,并且没有任何重大变化。任何人都可以就我的模型为什么这么快过拟合提供任何建议吗?
解决方案
是的,这是一个明显的过度拟合案例。以下是我的建议:
- 尝试减少隐藏层
- 将 drop out 增加到 0.5
- 创建更多合成图像或对原始图像应用转换。
推荐阅读
- keycloak - 在将 keycloak 设置为外部身份提供者时获取 IDENTITY_PROVIDER_LOGIN_ERROR
- regex - fail2ban 和特定的 RegEx
- java - Proguard 是否支持在 module-info.class 中混淆包名
- python - 显示模型中的选择(不使用 django 表单)
- angular - Angular11 中的 HTTPS API 调用
- swift - 从 UIViewControllerRepresentable 发送一个事件到 swiftui 视图
- debugging - Xamarin Forms - #if DEBUG 代码是否随发布版本一起提供?
- swift - 如何在 Swift 中创建 ruby 文本?
- mysql - 有谁知道是否有办法在 JSON_ARRAYAGG() 中实现任何排序或过滤?
- javascript - Jquery数据表导出按钮不起作用