我将此模型用于图像分类问题。我遇到的问题是,验证准确性始终比训练准确性低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进行贝叶斯超参数优化,但是它所建议的模型超参数对我来说并不是真正有效。我应该在模型中进行哪些更改以防止其过度拟合?我不会使用太多数据来训练和验证模型,因为我不会在实际生活中使用太多数据。任何建议将不胜感激。
答案 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
希望这会有所帮助!编码愉快!