我是否应该删除 VGG16 的最后 7 层,因为我要将其用作签名验证任务的预训练模型?

问题描述 投票:0回答:3

据我所知,cnn 的最后一层将对象作为一个整体进行识别,这与带有签名的数据集无关。因此,我想删除它们并在模型顶部添加额外的层,从而冻结 VGG16 的训练。删除层会如何影响模型的性能,或者我应该只保留并删除密集层?

无论如何,我都需要在顶部添加额外的层,以便学校报告有关卷积层配置对模型性能的影响。

p.s 我的数据集非常小,它包含近 700 个样本,这是非常小的我知道(我尝试增强数据)

我有一个带有中文签名的数据集,但我认为最好单独训练它//

我对这个领域并不精通,我是从深度学习开始认识的,所以如果您发现我的解释中有任何误解,请纠正我?/

tensorflow keras deep-learning conv-neural-network
3个回答
1
投票

最简单的方法是使用 VGG 并设置 include_top=False,weights='imagenet,并设置 pooling = max。这将使用 imagenet 权重实例化模型,顶部分类层将被移除,VGG 模型的输出是一个平面向量,您可以直接将其输入到密集层中。我的典型代码如下所示。在最后一层中,class_count 是训练数据中的类数。

base_model=tf.keras.applications.VGG16(include_top=False, weights="imagenet",input_shape=img_shape, pooling='max') 
x=base_model.output
x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x)
x = Dense(256, kernel_regularizer = regularizers.l2(l = 0.016),activity_regularizer=regularizers.l1(0.006),
                bias_regularizer=regularizers.l1(0.006) ,activation='relu')(x)
x=Dropout(rate=.45, seed=123)(x)        
output=Dense(class_count, activation='softmax')(x)
model=Model(inputs=base_model.input, outputs=output)

0
投票

删除层会如何影响模型的性能,或者我应该只留下并删除密集层?

这很难回答,因为你在谈论什么性能? VGG16 最初是针对具有 1000 个类的 Imagenet 问题构建的,因此如果您在不进行任何修改的情况下使用它可能根本无法工作。

现在,如果您谈论的是迁移学习,那么是的,可以替换最后的密集层来对数据集进行分类,因为使用 VGG16 中的 cnn 层创建的模型是一个很好的模式识别器。最后的完全连接层用作此模式的分类器,您应该替换它并针对您的特定问题再次训练它。 VGG16 末尾有 3 个密集层(FC1、FC2 和 FC3),keras 只允许您删除所有三个层,因此如果您只想替换最后一层,则需要删除所有三个层并重建 FC1 和 FC2。

关键是你之后要训练什么,你可以:

  1. 在 cnn 层中使用原始权重(imagenet)并从中开始训练,只需以较小的学习率进行微调即可。当您的数据集与原始数据集相似并且您拥有大量数据集时,这是一个不错的选择。
  2. 在 cnn 层中使用原始权重(imagenet),但冻结它们,并仅在您替换的密集层中训练权重。当您的数据集较小时,这是一个不错的选择。
  3. 不要使用原始权重并重新训练所有模型。通常不是一个好的选择,因为您需要成为调整参数、大量数据和计算能力的专家才能使其发挥作用。

0
投票

试图回复@Gerry P 的回复,但我太新了......

这与您的回答本质上相同吗?

model=Sequential()

model.add(VGG16())
model.add(BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001))
model.add(Dropout(0.5))
model.add(Dense(15, activation="sigmoid"))
© www.soinside.com 2019 - 2024. All rights reserved.