我正在一个网络上工作,该网络计算了刚结束的Kaggle比赛中无人机图像中海狮的数量。海狮还按类别(成年雄性,成年雌性等)进行区分。请帮助我了解为什么无法向该网络添加退出功能。

Keras的网络体系结构复制如下。最初,我接受了Imagenet上预训练的VGG16的前十五层。在这些之上,我放置了七个层:卷积,RELU,池化,卷积,RELU,池化和全局平均池化以输出计数。该模型在训练过程中过度拟合了数据,最终损失了400或500(优异的分数),但保持验证损失了850(体面的)。然后,我在VGG层之后添加了50%的辍学率,并在添加的每个层之后再次添加了。这是根据Stanford cs231 online course notes-“将其与在所有图层之后应用的dropout结合使用也是很常见的。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())

最佳答案

我建议您删除为每个卷积层添加的冗余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的历史记录检查您的训练历史记录,以检查是否有任何异常现象,这些异常现象可以解释您损失的异常行为。

08-25 05:11