问题描述
问题来源于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 : 串联的轴「也就是根据数据的哪一个维度进行合并,默认是最后一个维度」。