python - 如何防止此模型中的过度拟合?
问题描述
我为图像分类问题制作了这个模型。我遇到的问题是验证准确率总是比训练准确率低 5-8%,而验证损失远高于训练损失。这是我的一个时代的一个例子:损失: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 看起来足够好,但尝试增加它,看看会发生什么,
使用更多数据进行训练(正如您上面所说的那样不可能)
尝试更重的增强
尝试预训练网络
尝试合奏
尝试 tta(测试时间增加)
尝试任何其他训练策略,如余弦退火、混合生成器或其他生成器(不是 keras)作为标注
推荐阅读
- java - 从负 Joda 时间段中删除“-”
- python - 如何替换布尔列表序列中的值?
- node.js - 如何与 Zuul 网关后面的微服务建立套接字连接?
- visual-studio - Visual Studio - 代码更改时重建依赖项
- awk - 如何使用 sed 和 find 替换基于列表的文本
- java - 将 .jar 库的本机库 (.dll) 添加到 IntelliJ 中的工件
- c - 将两个正数相乘在 C 中返回负数
- webmin - 为什么我可以通过我的自定义域名服务器 ns1.mydomain.ltd 浏览我的网站?(网民)
- c# - 在 List<>.ForEach 方法调用中的 LINQ 表达式中使用时不等待
- google-cloud-dataflow - 在 GCP Dataflow 上运行的 Apache Beam 如何处理批量大型 SQL 表?