首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能防止这种型号的过火呢?

我怎样才能防止这种型号的过火呢?
EN

Stack Overflow用户
提问于 2019-07-17 13:23:02
回答 2查看 1.2K关注 0票数 3

我为一个图像分类问题做了这个模型。我遇到的问题是验证精度总是比训练精度低5-8%,验证损失远高于训练损失。下面是我的一个时代的例子:损失: 0.2232 - acc: 0.9245 - val_loss: 0.4131 - val_acc: 0.8700

代码语言:javascript
复制
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进行贝叶斯超参数优化,但是它推荐的模型超参数并不适用于我。我应该改变我的模型,以防止它过度适应?我没有使用太多的数据来训练和验证模型,因为我不会有太多的数据来描述模型在现实生活中的应用。如有任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-17 13:36:31

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

事实上,你的训练成绩比你的验证要好,但这并不意味着你已经适应过度了。当你的验证分数达到他们的最佳水平,然后随着训练而变得更糟时,你就变得过分适应了。

如果您正在寻找的是更好的验证分数--更好的模型泛化,那么您可以做的是:

  • 增加辍学率(你的辍学率看起来足够好,但是试着增加它,看看会发生什么,
  • 使用更多的数据进行培训(就像你前面说的那样不可能)
  • 尝试更重的增强
  • 尝试预先训练过的网络。
  • 试着合拍
  • 尝试增加测试时间
  • 尝试任何其他的训练策略,如余弦退火,混合发生器,或其他发电机(不是角轮)。
票数 4
EN

Stack Overflow用户

发布于 2019-11-06 16:03:03

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

由于DropOut层只在训练阶段使用以防止过度拟合,所以它们不用于测试阶段。这就是为什么Tf.Estimator现在很有名的原因,因为您可以更容易地使用is_training=True/False关闭DropOut

您可以使用tf.keras.backend.set_learning_phase(0)关闭。请确保您正在使用的tensorflow.keras从tensorflow.keras.layers导入Conv2D,MaxPooling2D,稠密,Dropout,输入,扁平,有区别的tf.keras和keras,tf.keras更好。

如果你已经关闭,下面是我的技巧,以防止过度安装:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57076930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档