如何防止此模型过度拟合?

时间:2019-07-17 13:23:02

标签: python tensorflow keras deep-learning conv-neural-network

我将此模型用于图像分类问题。我遇到的问题是,验证准确性始终比训练准确性低5-8%,而验证损失却比训练损失高得多。这是我其中一个时期的示例:损失:0.2232-帐户: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进行贝叶斯超参数优化,但是它所建议的模型超参数对我来说并不是真正有效。我应该在模型中进行哪些更改以防止其过度拟合?我不会使用太多数据来训练和验证模型,因为我不会在实际生活中使用太多数据。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

过度拟合是一回事,训练与验证错误是另一回事。

您的训练成绩胜过验证的事实并不表示您过拟合。当您的验证分数达到最高分数时,您就过度适应了,然后随着培训的开始变得越来越差。

如果您要寻找的是更好的验证评分-更好的模型概括性,那么您可以做的是:

  • 增加辍学率(您的辍学情况看起来足够好,但是请尝试增加它,看看会发生什么,

  • 使用更多数据进行训练(如上所述,这是不可能的)

  • 尝试更大的增强

  • 尝试预训练的网络

  • 尝试整合

  • 尝试tta(测试时间增加)

  • 尝试其他任何训练策略,例如余弦退火,混合生成器或其他生成器(不是keras)作为白蛋白

答案 1 :(得分:1)

您是否在测试阶段关闭了DropOut层?

由于DropOut层仅在训练阶段使用以防止过度拟合,因此在测试阶段不使用它们。这就是为什么Tf.Estimator如今很出名的原因,因为您可以使用is_training = True / False

轻松关闭DropOut

您可以使用tf.keras.backend.set_learning_phase(0)关闭。请确保您使用的是tensorflow.keras.layers中的tensorflow.keras导入Conv2D,MaxPooling2D,Dense,Dropout,Input,Flatten,tf.keras和keras之间存在差异,而tf.keras更好。

如果您已关闭电源,则以下是防止过度拟合的技术:
-进行错误分析。您可以参考Andrew教授的最佳材料https://www.coursera.org/learn/machine-learning-projects?specialization=deep-learning
-检查测试和训练集分布,数据扩充(翻转,旋转...)
-增加InputShape以获得更多功能。当前最好的技术之一是使用https://arxiv.org/pdf/1905.11946.pdf

的复合缩放方法

希望这会有所帮助!编码愉快!