在keras将两个独立的模型融合起来(多输入单输出)的基础上稍做改动
将两个独立的模型融合成一个整体
这里的模型在定义时没有使用传入参数,而是在模型融合的时候一起定义传入参数
import keras
from keras.models import Model
from keras.layers import Input,Dense,PReLU,Dropout #PRelU为带参数的ReLU
第一个模型:(分支网络之一)
def model1():
inp = Input(shape=(10,4))
x1 = keras.layers.Dense(8, activation='relu')(inp)
model=Model(input=inp,outputs=x1)
return model
第二个模型:(分支网络之二)
def model2():
inp2 = Input(shape=(16,4))
x2 = keras.layers.Dense(8, activation='relu')(inp2)
model=Model(input=inp2,outputs=x2)
return model
模型融合(在这里可以载入权重):
def merge_model():
model_1 = model1()
model_2 = model2()
#model_1.load_weights('model_1_weight.h5')#这里可以加载各自权重
#model_2.load_weights('model_2_weight.h5')#可以是预训练好的模型权重(迁移学习)
inp1 = model_1.input #参数在这里定义
inp2 = model_2.input #第二个模型的参数
r1=model_1.output
r2=model_2.output
x = keras.layers.Concatenate(axis= 1)([r1, r2])
model=Model(inputs=[inp1,inp2],outputs=x)
return model
merged_model = merge_model()
merged_model.summary()
根据需要修改模型:
def modify():#修改模型
origin_model=merge_model()
for layer in origin_model.layers:
layer.trainable = False#原来的不训练,冻结网络层
inp=origin_model.input
x=origin_model.output
den=Dense(200,name="fine_dense")(x)
l=PReLU()(den)
l=Dropout(0.5)(l)
result=Dense(10,activation="softmax")(l)
model=Model(input=inp,outputs=result)
model.summary()
return model
modified = modify()
修改后的模型结构: