我有三个经过训练的二元分类模型,它们在输出层使用 sigmoid 激活进行训练。
- 第一个模型返回从0到1的概率标量,以检查图像是否为数字 零 或不是。
- 第二个模型返回从 0 到 1 的概率标量来检查图像是否是数字 ONE 或否。
- 第三个模型返回从 0 到 1 的概率标量来检查图像是否是数字|| |两个 或不。 我知道我可以用
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 https://colab.research.google.com/drive/1y1mvAzebIFU_cuEQo8Q60L1I6uT8i2Ce?usp=sharing
可以通过定义一个新模型来组合的二进制分类模型,该模型将三个模型的预测作为输入并输出一个三类概率向量。以下是如何执行此操作:
from tensorflow.keras.layers import Input, Concatenate, Dense
from tensorflow.keras.models import Model
# ... 加载的三个模型(model_0、model_1、model_2)...
# 创建一个输入层,其形状与的二进制分类模型相同
input_layer = Input(shape=(28,28))
# 从每个模型中获取预测
output_0 = model_0(input_layer)
output_1 = model_1(input_layer)
output_2 = model_2(input_layer)
# 将预测连接成一个向量
merged_outputs = Concatenate()([output_0, output_1, output_2])
# 可选:添加一个密集层,后跟 softmax 以获得更准确的概率分布
# merged_outputs = Dense(3, activation='softmax')(merged_outputs)
# 创建新的多类模型
multiclass_model = Model(inputs=input_layer, outputs=merged_outputs)
# 打印模型摘要
multiclass_model.summary()
这个方法做了以下几件事:
- 创建输入层: 它定义了一个输入层来处理图像,就像的二进制分类模型一样。
- 获取每个模型的预测: 它将输入图像传递给每个二进制分类模型并获取其预测(0 到 1 之间的概率)。
- 连接预测: 它将三个模型的预测连接成一个包含三个值的向量。
-
创建多类模型:
它使用输入层和连接的输出创建一个新的 Keras
Model
。
这个新创建的
multiclass_model
将的三个二进制分类模型的预测视为输入。然后,可以使用此模型来预测输入图像属于三个类中的哪一个。
可选:
- 可以通过添加一个具有 softmax 激活函数的密集层来提高多类模型的性能,以获得更标准化的概率分布。
-
如果想访问中间层以提取特征,可以使用
keras
函数式 API。
请注意,此方法假设的三个二进制分类模型已经过良好的训练,并且每个模型的输出代表输入图像属于相应类别的置信度。
标签:python,tensorflow,machine-learning,keras,deep-learning From: 78773489