我为图像分类问题制作了这个模型。我遇到的问题是验证准确度总是比训练准确度低 5-8%,而验证损失远高于训练损失。这是我的一个纪元的示例:loss: 0.2232 - acc: 0.9245 - val_loss: 0.4131 - val_acc: 0.8700
model = Sequential()
model.add(Conv2D(32, 3, 3, border_mode='same', input_shape=(150,
150, 3), activation='relu'))
model.add(Conv2D(32, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(Conv2D(64, 3, 3, border_mode='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, 3, 3, border_mode='same',
activation='relu'))
model.add(Conv2D(128, 3, 3, border_mode='same',
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, 3, 3, border_mode='same',
activation='relu'))
model.add(Conv2D(256, 3, 3, border_mode='same',
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=RMSprop(lr=0.0001),
metrics=['accuracy'])
# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.1,
zoom_range=0.1,
horizontal_flip=True)
# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)
我尝试过使用 Hyperas 进行贝叶斯超参数优化,但它推荐的模型超参数并不真正适合我。我应该在我的模型中更改什么以防止它过度拟合?我没有使用太多数据来训练和验证模型,因为我没有太多关于模型将在现实生活中使用的数据。任何建议将不胜感激。
最佳答案
过度拟合是一回事,训练与验证错误是另一回事。
您的训练分数优于验证分数这一事实并不意味着您过度拟合。当您的验证分数达到最佳然后随着训练开始变得更糟时,您就过度拟合了。
如果您正在寻找更好的验证分数 - 更好的模型泛化,您可以做的是:
增加 dropout(你的 dropout 看起来不错,但尝试增加它看看会发生什么,
使用更多数据进行训练(不可能像你上面说的那样)
尝试更重的增强
尝试预训练网络
尝试集成
try tta(测试时间增加)
尝试任何其他训练策略,如余弦退火、混合生成器或其他生成器(非 keras)作为白化
关于python - 如何防止此模型中的过度拟合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57076930/