keras将两个独立的模型融合起来(多输入单输出)

原文链接: https://blog.csdn.net/qq_33266320/article/details/82558740

将两个独立的模型融合成一个

参考:keras实现多个模型融合
优点:可以给两个模型单独赋予权重
想法:用在迁移学习中时,可以先预训练好其中一个模型,保存权重,再载入到总的模型中

import keras
from keras.models import Model
from keras.layers import Input,Dense,PReLU,Dropout #PRelU为带参数的ReLU

第一个模型:(分支网络之一)

def model1(inp):
    x1 = keras.layers.Dense(8, activation='relu')(inp)
    model=Model(input=inp,outputs=x1)
    return model

第二个模型:(分支网络之二)

def model2(inp2):
    x2 = keras.layers.Dense(8, activation='relu')(inp2)
    model=Model(input=inp2,outputs=x2)
    return model

模型融合(在这里可以载入权重):

def merge_model():
    inp1 = Input(shape=(10,4))
    inp2 = Input(shape=(16,4))
    model_1 = model1(inp1)
    model_2 = model2(inp2)
    
    
    #model_1.load_weights('model_1_weight.h5')#这里可以加载各自权重
    #model_2.load_weights('model_2_weight.h5')#可以是预训练好的模型权重(迁移学习)

    r1=model_1.output
    r2=model_2.output
    x = keras.layers.Concatenate(axis= 1)([r1, r2])
    model=Model(input=[inp1,inp2],outputs=x)
    return model    
merged_model = merge_model()
merged_model.summary()

keras将两个独立的模型融合起来(多输入单输出)_第1张图片
根据需要修改模型:
*网络层冻结(固定一部分网络层参数不变,只训练特定的网络层)
*添加网络层(添加卷积层,改变输出大小…)

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()

修改后的模型结构:
keras将两个独立的模型融合起来(多输入单输出)_第2张图片

你可能感兴趣的:(keras将两个独立的模型融合起来(多输入单输出))