我有三个经过训练的二元分类模型,它们在输出层使用 sigmoid 激活进行训练。
我知道我可以用 softmax 来训练它们,并在输出层构建具有三个神经元的模型。但是假设我遇到一种情况,由于模型复杂,训练它们的权重确实需要很长时间,我只有它们各自的二元分类模型。或者,我想在隐藏层提取它们的隐藏表示特征,例如
model_0
(二进制分类以检查图像是否为零)。
那么,如何将它们连接/组合/合并为单个模型? 我的代码目前停留在这一点上:
model_0 = init_binary_classification_model((28,28))
model_0.load_weights('trained_weight_of_binary_classification_to_check_whether_image_is_zero.h5')
model_1 = init_binary_classification_model((28,28))
model_1.load_weights('trained_weight_of_binary_classification_to_check_whether_image_is_one.h5')
model_2 = init_binary_classification_model((28,28))
model_2.load_weights('trained_weight_of_binary_classification_to_check_whether_image_is_two.h5')
地点:
def init_binary_classification_model(input_shape=(28,28)):
input_layer = Input(shape=input_shape)
tensor = Flatten()(input_layer)
tensor = Dense(16, activation='relu')(tensor)
tensor = Dense(8, activation='relu')(tensor)
output_layer = Dense(1, activation='sigmoid')(tensor)
return Model(inputs=input_layer, outputs=output_layer)
我希望多分类模型具有相同的输入形状
(28,28)
和不同的输出形状(3)
,并且我不需要重新训练模型(如果可能)。
完整代码可在 https://colab.research.google.com/drive/1y1mvAzebIFU_cuEQo8Q60L1I6uT8i2Ce?usp=sharing
m0 = init_binary_classification_model(input_shape)
m0.load_weights('model_0_weights.h5')
m1 = init_binary_classification_model(input_shape)
m1.load_weights('model_1_weights.h5')
m2 = init_binary_classification_model(input_shape)
m2.load_weights('model_2_weights.h5')
from keras.layers import Softmax, Concatenate
input_layer = Input(shape=(28,28))
output_0 = model_0(input_layer)
output_1 = model_1(input_layer)
output_2 = model_2(input_layer)
concat_output = Concatenate()([output_0, output_1, output_2])
final_output = Softmax()(concat_output)
final_model = Model(inputs=input_layer, outputs=final_output)