首页 > 解决方案 > 在进行迁移学习时,保留哪些 CNN 全连接层的最佳实践是什么?

问题描述

我似乎找不到这个问题的具体答案。我目前正在从VGG19网络进行迁移学习,我的目标领域是文档分类(仅通过视觉分类或将 CNN 的特征提取用于另一个模型)。我想了解在哪些情况下需要保留模型的所有全连接层,在哪些情况下我应该删除全连接层并在最后一个卷积层之上创建一个新的全连接层。这些选择中的每一个对训练、预测等意味着什么?

这些是使用 Keras 的代码示例,我的意思是:

提取最后一个全连接层:

original_model = VGG19(include_top=True, weights='imagenet', input_shape=(224, 224, 3))
layer_name = 'fc2'
x = Dropout(0.5)(original_model.get_layer(layer_name).output)
x = BatchNormalization()(x)
predictions = Dense(num_classes, activation='softmax')(x)

features_model = Model(inputs=original_model.input, outputs=predictions)
adam = optimizers.Adam(lr=0.001)
features_model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
features_model.summary()

return features_model

在最后一个卷积层之后添加一个全连接层:

original_model = VGG19(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
x = Flatten()(base_model.output)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = BatchNormalization()(x)
predictions = Dense(num_classes, activation='softmax')(x)

head_model = Model(input=base_model.input, output=predictions)

adam = optimizers.Adam(lr=0.001)
head_model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
head_model.summary()
return head_model

在进行迁移学习时选择什么有经验法则吗?

标签: machine-learningkerasdeep-learningconv-neural-networkdata-science

解决方案


根据我过去的经验,成功地将股票市场的迁移学习应用于商业预测,您应该保持原始结构,因为如果您进行迁移学习,您将希望加载从原始结构训练的权重,而不会出现神经网络架构差异的问题. 然后你解冻 CNN 的部分,你的神经网络训练将从高精度开始训练,并为目标问题调整权重。

但是,如果您删除一个Flatten层,计算成本将会降低,因为您将有更少的参数来训练。

我遵循保持神经网络尽可能简单(等于更大的泛化属性)的规则,并且效率很高。

@Kamen,作为您评论的补充,关于您需要多少数据,这取决于您的数据的差异。更多的方差,你将需要更多的层和权重来学习细节。然而,当你增加架构的复杂性时,你的神经网络将更容易过度拟合,而不是使用 Dropout 来减少。

由于全连接层是神经网络中成本较高的部分,如果添加其中的一两个,您的参数数量会增加很多,需要更多的时间来训练。使用更多层,您将获得更高的准确性,但您可能会过拟合。

例如,具有 10,000 个示例的 MNIST 可以通过非常简单的架构达到大于 99% 的准确度。但是,IMAGENET 有 1,000,000 个示例(155 GB),因此需要更复杂的结构,例如 VGG16。


推荐阅读