据我所知,cnn 的最后一层将对象作为一个整体进行识别,这与带有签名的数据集无关。因此,我想删除它们并在模型顶部添加额外的层,从而冻结 VGG16 的训练。删除层会如何影响模型的性能,或者我应该只保留并删除密集层?
无论如何,我都需要在顶部添加额外的层,以便学校报告有关卷积层配置对模型性能的影响。
p.s 我的数据集非常小,它包含近 700 个样本,这是非常小的我知道(我尝试增强数据)
我有一个带有中文签名的数据集,但我认为最好单独训练它//
我对这个领域并不精通,我是从深度学习开始认识的,所以如果您发现我的解释中有任何误解,请纠正我?/
最简单的方法是使用 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)
删除层会如何影响模型的性能,或者我应该只留下并删除密集层?
这很难回答,因为你在谈论什么性能? VGG16 最初是针对具有 1000 个类的 Imagenet 问题构建的,因此如果您在不进行任何修改的情况下使用它可能根本无法工作。
现在,如果您谈论的是迁移学习,那么是的,可以替换最后的密集层来对数据集进行分类,因为使用 VGG16 中的 cnn 层创建的模型是一个很好的模式识别器。最后的完全连接层用作此模式的分类器,您应该替换它并针对您的特定问题再次训练它。 VGG16 末尾有 3 个密集层(FC1、FC2 和 FC3),keras 只允许您删除所有三个层,因此如果您只想替换最后一层,则需要删除所有三个层并重建 FC1 和 FC2。
关键是你之后要训练什么,你可以:
试图回复@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"))