最近,我建立了一个简单的卷积神经网络,使用背景减法将手势图像识别为黑色,从而在屏幕上将其变成白色,从而具有黑色背景。它大部分是使用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的值和位置,没有太大变化。谁能为我的模型过快拟合提供任何建议?
答案 0 :(得分:0)
在处理如此大量的过度拟合现象时,一个好的出发点是减少层数。
尽管您在许多最大池后添加了Dropout
,但仍然会遇到过拟合现象。
在下面,我提出一些建议:
GlobalAveragePooling2D
而不是Dense
层。卷积神经网络不需要后者,除了
最后一层是sigmoid
或softmax
。 SpatialDropout2D
。与典型的Dropout
相比,
应用于要素地图中的每个元素后,SpatialDropout会删除整个要素地图。答案 1 :(得分:0)
是的,这显然是过度拟合的情况。这是我的建议: