Neural network 在加入辍学率后,我的神经网络比以前更加过拟合。什么';发生什么事了?

Neural network 在加入辍学率后,我的神经网络比以前更加过拟合。什么';发生什么事了?,neural-network,computer-vision,deep-learning,keras,conv-neural-network,Neural Network,Computer Vision,Deep Learning,Keras,Conv Neural Network,我当时正在一个网络上工作,该网络为刚刚结束的卡格尔竞赛统计无人机图像中的海狮数量。海狮也按等级(成年雄性、成年雌性等)区分。请帮助我理解为什么将辍学者添加到此网络不起作用 Keras中的网络架构复制如下。最初,我在Imagenet上预训练了前15层VGG16。在这些层之上,我放置了七层:卷积、RELU、池、卷积、RELU、池和全局平均池来输出计数。该模型在训练期间过度拟合数据,最终损失400或500分(优秀分数),但坚持验证损失约850分(体面)。然后,我在VGG层之后添加了50%的辍学率,在我

我当时正在一个网络上工作,该网络为刚刚结束的卡格尔竞赛统计无人机图像中的海狮数量。海狮也按等级(成年雄性、成年雌性等)区分。请帮助我理解为什么将辍学者添加到此网络不起作用

Keras中的网络架构复制如下。最初,我在Imagenet上预训练了前15层VGG16。在这些层之上,我放置了七层:卷积、RELU、池、卷积、RELU、池和全局平均池来输出计数。该模型在训练期间过度拟合数据,最终损失400或500分(优秀分数),但坚持验证损失约850分(体面)。然后,我在VGG层之后添加了50%的辍学率,在我添加的每个层之后再次添加。这是根据“将其与所有层后应用的退出相结合也是很常见的。p=0.5的值是一个合理的默认值。”经过一段时间的培训后,培训损失已降至约800,但坚持验证损失仍停留在1200+(一点也不好),这在培训早期就已达到

为什么增加辍学率不起作用?是否还有其他问题,比如体系结构、任务或优化器

编辑:另外,只有约800张训练图像和另外约150张在坚持验证集中,但我也使用了水平翻转、垂直翻转和高达180度旋转的数据增强

base_model = VGG16(weights='imagenet', include_top=False)

x = base_model.layers[15].output
x = Dropout(0.5)(x)

x = Conv2D(128, kernel_size=(3, 3), padding='same')(x)
x = Dropout(0.5)(x)
x = Activation('relu')(x)
x = Dropout(0.5)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.5)(x)

x = Conv2D(n_classes, kernel_size=(3, 3), padding='same')(x)
x = Dropout(0.5)(x)
x = Activation('relu')(x)
x = Dropout(0.5)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.5)(x)

x = GlobalAveragePooling2D()(x)

model = Model(inputs=base_model.input, outputs=x)
for layer in base_model.layers:
    layer.trainable = False
model.compile(loss=keras.losses.mean_squared_error,
        optimizer= keras.optimizers.Adadelta())

我建议您删除为每个卷积层添加的冗余辍学:

x = Conv2D(128, kernel_size=(3, 3), padding='same')(x)
x = Dropout(0.5)(x) # <-- redundant, remove this
x = Activation('relu')(x)
x = Dropout(0.5)(x) <-- remove this as well
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.5)(x)
x=Conv2D(128,内核大小=(3,3),padding='same')(x)

x=退出(0.5)(x)#您是否在验证集中也使用了数据增强?(可能是增强使训练集与验证集有了足够的不同?)为什么要为每个
Conv2D
层添加两次退出
x=Dropout(0.5)(x)x=Activation('relu')(x)x=Dropout(0.5)(x)
这肯定会造成麻烦,因为您可能会在训练期间随机删除几乎所有的神经元。@petezurich Ok,看起来这改善了网络,但没有解决问题。坚持损失稳定在1100左右,而训练损失继续减少到750左右。相比之下,在没有辍学的情况下,当它达到约750次训练损失时,已经达到约850次坚持损失。因此,辍学仍然会使过度装修变得更糟。真奇怪!通常,查看历史有助于检查可能导致这种异常行为的任何异常或提示。您的模型是否立即开始学习?您的列车和val的损失会聚多长时间?何时以及为什么中止培训?“我的习惯是总是使用Tensorboard或model.fit()本身的历史来查看发生了什么。”彼得苏黎世让它工作了!我注意到在Keras摘要中,池层中没有可训练的参数,因此我也删除了该层之后的辍学。现在,与原始网络相比,它显示出明显较少的过度拟合。这只是您最初所说内容的扩展,因此,如果您想将其全部添加为答案,我会将其标记为正确。如果您对为什么池不算作一个单独的层有任何其他见解,也将不胜感激。谢谢你的帮助!