我的卷积神经网络过度拟合

时间:2020-01-31 06:14:18

标签: python tensorflow machine-learning keras neural-network

最近,我建立了一个简单的卷积神经网络,使用背景减法将手势图像识别为黑色,从而在屏幕上将其变成白色,从而具有黑色背景。它大部分是使用keras Conv2D构建的。我的数据集有1000张用于训练的图片和100张用于验证和测试的图片。奇怪的是,在第一个时期之后立即出现问题,在此期间模型的损失下降了很多。通常在第二个时期开始时,它从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的值和位置,没有太大变化。谁能为我的模型过快拟合提供任何建议?

2 个答案:

答案 0 :(得分:0)

在处理如此大量的过度拟合现象时,一个好的出发点是减少层数。

尽管您在许多最大池后添加了Dropout,但仍然会遇到过拟合现象。

在下面,我提出一些建议:

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

答案 1 :(得分:0)

是的,这显然是过度拟合的情况。这是我的建议:

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