問題描述
問題來源于2021年MCM C題哪轿,官方給出的數(shù)據(jù)中既包含圖像盈魁,又包含常規(guī)的文本,數(shù)字向量數(shù)據(jù)窃诉,若要同時利用上這些數(shù)據(jù)杨耙,可以搭建一種包含兩個輸入層的模型,一個用于處理圖像飘痛,另一個用于處理常規(guī)向量(還有一種方式是定義一個輸入數(shù)據(jù)的類珊膜,在這個類中集合圖像和向量)。
模型結構設計
對于處理圖像的網(wǎng)絡結構宣脉,我是直接使用了Vgg-16的網(wǎng)絡結構车柠,去掉了最后三個全連接層,處理向量的網(wǎng)絡結構是我自己搭建的全連接網(wǎng)絡塑猖,模型結構圖如下:
Model_Architecture .png
模型實現(xiàn)
導包
from keras.layers import Dense
from keras.models import Model
from keras.models import Sequential
首先加載Vgg-16網(wǎng)絡
# 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網(wǎng)絡除最后三層外添加到模型
model_left.add(layer)
for layer in model_left.layers:
layer.trainable = False # 固定模型的參數(shù)(遷移學習)
獲取左邊模型的輸入和輸出竹祷,這里input_left和output_left的數(shù)據(jù)類型是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是我自己設置的權重,即只保留全連接網(wǎng)絡輸出的20%羊苟。
output_right = model_right.output*0.2
合并兩個模型
# model concat
concatenated = keras.layers.concatenate([output_left, output_right])
#concatenate函數(shù)的API見下方「補充」
搭建網(wǎng)絡的剩余部分
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)
參數(shù)說明:
- inputs : 一個列表的輸入張量(列表大小至少為 2)塑陵。
- axis : 串聯(lián)的軸「也就是根據(jù)數(shù)據(jù)的哪一個維度進行合并,默認是最后一個維度」践险。