使用Keras Functional API微调模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Keras Functional API微调模型相关的知识,希望对你有一定的参考价值。

我正在使用VGG16对我的数据集进行微调。

这是模型:

def finetune(self, aux_input):
        model = applications.VGG16(weights='imagenet', include_top=False)
        # return model

        drop_5 = Input(shape=(7, 7, 512))
        flatten = Flatten()(drop_5)
        # aux_input = Input(shape=(1,))
        concat = Concatenate(axis=1)([flatten, aux_input])

        fc1 = Dense(512, kernel_regularizer=regularizers.l2(self.weight_decay))(concat)
        fc1 = Activation('relu')(fc1)
        fc1 = BatchNormalization()(fc1)

        fc1_drop = Dropout(0.5)(fc1)
        fc2 = Dense(self.num_classes)(fc1_drop)
        top_model_out = Activation('softmax')(fc2)

        top_model = Model(inputs=drop_5, outputs=top_model_out)

        output = top_model(model.output)

        complete_model = Model(inputs=[model.input, aux_input], outputs=output)

        return complete_model

我有两个模型输入。在上面的函数中,我使用Concatenate作为flattened数组和我的aux_input。我不确定这是否适用于imagenet权重。

当我运行它时,我收到一个错误:

ValueError:Graph disconnected:无法在层“aux_input”获取张量Tensor(“aux_input:0”,shape =(?,1),dtype = float32)的值。访问以下先前的图层时没有问题:['input_2','flatten_1']

不知道我哪里错了。

如果重要,这是适合的功能:

model.fit(x={'input_1': x_train, 'aux_input': y_aux_train}, y=y_train, batch_size=batch_size,
                    epochs=maxepoches, validation_data=([x_test, y_aux_test], y_test),
                    callbacks=[reduce_lr, tensorboard], verbose=2)

但是,当我打电话给fit时,我在这个model.summary()函数之前得到一个错误。

答案

问题是你在aux_input中使用top_model但是你没有在top_model的定义中将它指定为输入。尝试使用以下内容替换top_modeloutput的定义:

top_model = Model(inputs=[drop_5, aux_input], outputs=top_model_out)
output = top_model([model.output, aux_input])

以上是关于使用Keras Functional API微调模型的主要内容,如果未能解决你的问题,请参考以下文章

python 微调Keras模型。已更新至Keras 2.0 API。

TensorFlow2 入门指南 | 13 Keras Functional API 官方教程

TensorFlow2 入门指南 | 13 Keras Functional API 官方教程

在 TensorFlow Functional API 中保存和加载具有相同图形的多个模型

Keras之函数式(Functional)模型

Keras:微调 Inception 时精度下降