Keras如何合并两个模型

问题描述

问题来源于2021年MCM C题,官方给出的数据中既包含图像,又包含常规的文本,数字向量数据,若要同时利用上这些数据,可以搭建一种包含两个输入层的模型,一个用于处理图像,另一个用于处理常规向量(还有一种方式是定义一个输入数据的类,在这个类中集合图像和向量)。

模型结构设计

对于处理图像的网络结构,我是直接使用了Vgg-16的网络结构,去掉了最后三个全连接层,处理向量的网络结构是我自己搭建的全连接网络,模型结构图如下:


Model_Architecture .png

模型实现

导包

from keras.layers import  Dense
from keras.models import Model
from keras.models import Sequential

首先加载Vgg-16网络

# load vgg-16
model_vgg16 = tf.keras.applications.vgg16.VGG16()
model_vgg16.summary()

搭建左边的模型

model_left = Sequential()
for layer in model_vgg16.layers[:-3]: #将Vgg-16网络除最后三层外添加到模型
    model_left.add(layer)

for layer in model_left.layers:  
    layer.trainable = False       # 固定模型的参数(迁移学习)

获取左边模型的输入和输出,这里input_left和output_left的数据类型是KerasTensor

input_left = model_left.input
output_left = model_left.output

搭建右侧的模型并获取模型的输入和输出

model_right = Sequential()
model_right.add(Dense(units=300,input_shape=(53,),activation='relu'))
model_right.add(Dense(units=300,activation='relu'))
model_right.add(Dense(units=300,activation='relu'))
model_right.add(Dense(units=300))
input_right = model_right.input
# 这里乘的0.2是我自己设置的权重,即只保留全连接网络输出的20%。
output_right = model_right.output*0.2  

合并两个模型

# model concat
concatenated = keras.layers.concatenate([output_left, output_right])
#concatenate函数的API见下方「补充」

搭建网络的剩余部分

x = Dense(1000, activation='relu')(concatenated)
x = Dense(1000, activation='relu')(x)
final_output = Dense(3,activation='softmax')(x)
model = Model(inputs=[input_left,input_right],outputs=final_output)

API补充

concatenate

keras.layers.concatenate(inputs, axis=-1)

参数说明:

  • inputs : 一个列表的输入张量(列表大小至少为 2)。
  • axis : 串联的轴「也就是根据数据的哪一个维度进行合并,默认是最后一个维度」。

你可能感兴趣的:(Keras如何合并两个模型)