如何在keras tensoflow中合并两个模型来制作一个模型

时间:2017-12-06 08:29:31

标签: tensorflow deep-learning keras

我有两个预先训练的模型,一个用于年龄分类,另一个用于性别分类。我想建立年龄 - 性别分类器网络,所以我想合并这两个网络,并从同一网络中预测年龄和性别。

我试过的是

from keras.models import load_model

model_age = load_model(model_age_path)
model_gender = load_model(model_gender_path)

我如何合并两个模型并培训同时执行这两个模型的网络

1 个答案:

答案 0 :(得分:2)

这取决于"合并"对你意味着什么 如果您想从单个输入中输出年龄和性别,那么您需要多个" head":

from keras import Input
from keras.models import load_model

model_age = load_model('age.hdf5')
model_gender = load_model('gender.hdf5')

x = Input(shape=[299, 299, 3])
y_age = model_age(x)
y_gen = model_gender(x)

model = Model(inputs=x, outputs=[y_age, y_gen])

data, target = load_data()
p_age, p_gender = model.predict(data)

print(p_age)
# [[ 0.57398415,  0.42601582],
#  [ 0.5397228 ,  0.46027723],
#  [ 0.6648131 ,  0.33518684],
#  [ 0.5917415 ,  0.4082585 ]]

print(p_gender)
# [[ 0.13119246],
#  [ 0.        ],
#  [ 0.1875571 ],
#  [ 0.        ]]

但现在考虑到这一点:两个任务(回归年龄,性别分类)在某种程度上都有某种程度的相似性,对吗?例如,如果您的数据由图像组成,则需要检测线条,面片和简单的几何形状以做出决定。换句话说,很多转换层'两个网络都可以重用权重,使整个过程更加高效。 你可以在这个培训中实现一个同时完成这两件事的新模型:

from keras.applications import VGG19

base_model = VGG19(weights='imagenet')  # or any model, really.
y = base_model.output
y_age = Dense(1, activation='relu')(y)

y = base_model.output
y = Dense(128, activation='relu')(y)
y = Dense(128, activation='relu')(y)
y_gender = Dense(2, activation='softmax')(y)

model = Model(inputs=base_model.inputs, outputs=[y_age, y_gender])