我想微调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_model
与top_model
的性能相同,因为没有更新权重),所以我冻结了整个模型。
complete_model.trainable = False
检查complete_model.summary()确认我的可训练参数为零。
现在,作为完整性检查,在开始进行微调之前,我会评估complete_model
的性能。但是,事实证明性能太差了,看起来好像根本没有训练模型。
由于我无法在评估管道中找到该错误,所以我想知道我是否正确使用了功能API来实现自己的意图?
我们非常感谢您的帮助!