添加辍学后,我的神经网络比以前更加过度拟合。发生了什么事?

时间:2017-06-29 18:28:13

标签: neural-network computer-vision deep-learning keras conv-neural-network

我正在研究一个网络,该网络计算了无人机图像中海狮的数量,这是一场刚刚结束的Kaggle比赛。海狮也按类别(成年男性,成年女性等)区分。请帮助我理解为什么在这个网络中添加dropout不起作用。

下面复制了Keras的网络架构。最初,我在Imagenet上预先训练了前15层VGG16。除此之外,我还提出了七个层次:卷积,RELU,池化,卷积,RELU,池化和全局平均池化以输出计数。这个模型在训练期间过度拟合数据,以400或500(优秀分数)的损失结束,但保持验证损失约为850(体面)。然后,我在VGG层之后添加了50%的丢失,并且在我添加的每个层之后再次添加。这是Stanford cs231 online course notes - "通常将此与在所有图层之后应用的丢失相结合。 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())

1 个答案:

答案 0 :(得分:4)

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

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)

除此之外,我建议您使用model.fit()或Tensorboard的历史记录检查您的培训历史记录,以检查可能解释您的损失的异常行为的任何异常情况。