通过预先提取特征微调VGG16(Keras功能API)

时间:2018-10-24 17:35:44

标签: python tensorflow keras

我想微调VGG16模型。但是,一旦将自定义分类器与基于vgg16的分类器结合起来,性能就会下降。这些是我正在采取的步骤:

我创建一个base_model,它是一个VGG16模型,并使用它从base_model的最后一层(即block5_pool(shape =(7,7,512)))中提取瓶颈特征。到目前为止,一切都很好。

接下来,我将使用提取的功能在顶部训练分类器模型(top_model)。

from keras.layers import Input
visible = Input(shape=(7, 7, 512))
x = Flatten()(visible)
x = Dense(124, activation='relu')(visible)
x = Dense(52, activation='relu')(x)
x = Flatten()(x)
output = Dense(32, activation='softmax')(x)

top_model = Model(inputs=visible, outputs=output)

此模型在验证数据上的性能很好。

现在事情开始崩溃...

接下来,我要微调base_model。我创建了一个新的VGG16模型,然后将其输出传递给训练有素的“ top_model”,以创建和端对端的转换管道。

from keras.applications import VGG16
conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

output = top_model(conv_base.output)
complete_model = Model(inputs=conv_base.input, outputs=output)

现在要检查一切是否按预期工作(即complete_modeltop_model的性能相同,因为没有更新权重),所以我冻结了整个模型。

complete_model.trainable = False

检查complete_model.summary()确认我的可训练参数为零。

现在,作为完整性检查,在开始进行微调之前,我会评估complete_model的性能。但是,事实证明性能太差了,看起来好像根本没有训练模型。

由于我无法在评估管道中找到该错误,所以我想知道我是否正确使用了功能API来实现自己的意图?

我们非常感谢您的帮助!

0 个答案:

没有答案