【问题标题】:What is best practice for which CNN fully-connected layers to keep when doing transfer-learning?在进行迁移学习时,保留哪些 CNN 全连接层的最佳实践是什么?
【发布时间】:2023-03-28 11:54:01
【问题描述】:

我似乎找不到这个问题的具体答案。我目前正在从 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-learning keras deep-learning conv-neural-network data-science


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 您好,这也是我目前的做法。我宁愿寻找两种方法之间的比较(如果问题不是太模糊的话),例如它如何影响学习、预测、需要多少数据来微调新的全连接层与需要多少数据需要微调现有的等等。
    • @Kamen,我为您的评论添加了对我的回答的补充。
    • 谢谢 :) 这说明了很多事情!
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2016-06-17
    • 2023-03-14
    • 2020-02-20
    相关资源
    最近更新 更多