machine-learning - 在进行迁移学习时,保留哪些 CNN 全连接层的最佳实践是什么?

标签 machine-learning keras deep-learning conv-neural-network data-science

我似乎找不到这个问题的具体答案。我目前正在从 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

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

最佳答案

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

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

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

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

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

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

关于machine-learning - 在进行迁移学习时,保留哪些 CNN 全连接层的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644114/

相关文章:

python - 在 TensorFlow 中完成训练过程后使用 predict() 方法

python - 如何使用 Keras 创建多输入一输出 LSTM 模型?

python - 微调 keras .h5 模型到 c++ 中使用的 .pb 模型给出运行模型失败错误

tensorflow - 如何在我的代码中使用张量核心而不是 cuda 核心?

python - 更改 Keras 中的输入大小

python - 使用 Scikit Learn 的 SVM 多类分类 - 代码未完成

python - 使用 Keras 和 TensorFlow 实现 LSTM 网络

python - 如何从 gridSearchCV 的输出中获取特征名称

machine-learning - 如何解读scikit的learn混淆矩阵和分类报告?

python - tensorflow ,tf.while_loop : The two structures don't have the same nested structure