将三个经过训练的二元分类模型组合成keras中的单个多分类模型

问题描述 投票:0回答:1

我有三个经过训练的二元分类模型,它们在输出层使用 sigmoid 激活进行训练。

  1. 第一个模型返回从 0 到 1 的概率标量,以检查图像是否为数字 ZERO
  2. 第二个模型返回从 0 到 1 的概率标量,以检查图像是否为数字 ONE
  3. 第三个模型返回从 0 到 1 的概率标量,以检查图像是否为数字 TWO

enter image description here

我知道我可以用 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

python tensorflow machine-learning keras deep-learning
1个回答
0
投票

加载经过训练的二元分类模型

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)
© www.soinside.com 2019 - 2024. All rights reserved.