我有两个预先训练的模型,一个用于年龄分类,另一个用于性别分类。我想建立年龄 - 性别分类器网络,所以我想合并这两个网络,并从同一网络中预测年龄和性别。
我试过的是
from keras.models import load_model
model_age = load_model(model_age_path)
model_gender = load_model(model_gender_path)
我如何合并两个模型并培训同时执行这两个模型的网络
答案 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])