如何使用函数API合并两个keras模型(一个冻结)

gcmastyq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(157)

如何使用函数API合并两个Keras模型。我的意思是,我有两个模型(a,它是用冷冻重量预先训练的,和b)。我想通过将b模型添加到冷冻模型的底部来创建一个c模型。
具体来说,我有以下两种模式:

def define_neural_network_model_1st(input_shape, initializer, outputs = 1):
   ........
  return model

def define_neural_network_model_2st(input_shape, initializer, outputs = 1):
   ........
  return model

由于第一个是训练我加载的重量和冻结模型。

neural_network_model_1st.load_weights('./../some_path.hdf5')
   neural_network_model_1st.trainable = False

当我试图以下面的方式合并两个块时

merge_interpretation = Model(inputs=[neural_network_model_1st.inputs], outputs=neural_network_model_2st(neural_network_model_1st.inputs))

我正在接收:

我做错了什么?我正在等待有1层从冻结模型加上所有层在第二个。

ar7v8xwq

ar7v8xwq1#

假设我有两个模型,

resnet_50 = tf.keras.applications.ResNet50(weights=None,
                           input_shape=(224 , 224 , 3),
                           classes = 2)
vgg_16 = tf.keras.applications.VGG16(
weights=None,
input_shape=(224,224,3),
classes=2,
include_top=False)

现在,我想合并这两个模型,首先,我将确保第一个模型的输出形状与第二个模型的输入形状相同,因此,首先我必须做一些预处理。

model = tf.keras.Model(vgg_16.inputs , vgg_16.layers[-2].output)
model2 = tf.keras.Model(resnet_50.get_layer('conv4_block6_out').input , resnet_50.output)
input = tf.keras.layers.Input(shape=(224 , 224 , 3))
out1 = model(input)
intermediate_layer = tf.keras.layers.Conv2D(model2.inputs[0][0].shape[2] , 1 , 1 , padding='same')(out1)
out2 = model2(intermediate_layer)
f_model = tf.keras.Model(input , out2)
tf.keras.utils.plot_model(
f_model,
show_shapes=True)

现在,这是两个模型的输出形状[两个组合模型的体系结构][1] [1]:https://i.stack.imgur.com/F7H8d.png
通过执行此操作,您可以查看各个模型的摘要

f_model.layers[1].summary() #This will show the summary of the first model VGG16
f_model.layers[3].summary() #This will show the summary of the second model Resnet18

但是如果你运行f_model.summary(),这将不会显示合并的两个模型作为一个的摘要,因为在后端Keras将模型一作为功能图节点,所以它作为图的节点。

相关问题