在 keras 的输出阶段组合多个预训练模型

Posted

技术标签:

【中文标题】在 keras 的输出阶段组合多个预训练模型【英文标题】:Combining multiple pretained models at the ouput stage in keras 【发布时间】:2021-04-22 17:31:00 【问题描述】:

我创建了四个 3D-CNN 模型,每个模型都在一组不同(但相关)的图像上进行训练,这样每组都具有相同对象的不同视角的图像。 (即:n 个对象有来自 4 个不同视角的图像,每个模型都关联到一个视角)。

def get_model(width=128, height=128, depth=4):


inputs = Input((width, height, depth, 3))

x = Conv3D(filters=64, kernel_size=8,padding='same', activation="relu")(inputs)
x = MaxPool3D(pool_size=2,data_format= "channels_first", padding='same')(x)
x = BatchNormalization()(x)


x = Conv3D(filters=256, kernel_size=3,padding='same', activation="relu")(x)
x = MaxPool3D(pool_size=2,data_format= "channels_first", padding='same')(x)
x = BatchNormalization()(x)

x = GlobalAveragePooling3D()(x)
x = Dense(units=512, activation="relu")(x)
x = Dropout(0.3)(x)

outputs = Dense(units=2, activation="sigmoid")(x)

# Define the model.
model = keras.Model(inputs, outputs)
return model

我现在有四个预训练模型,我想通过删除最后一个密集层(sigmoid)来组合它们,而是连接所有四个模型的密集层,然后是一个激活函数(即:sigmoid) .我想保留四个输入层,这样每个输入层都会从一个角度拍摄一个物体的图像。我已经看到了将 model_1 的输出层连接到 model_2 的输入层的示例,但是,我不确定如何处理四个单独的输入层并在模型末尾进行连接。

【问题讨论】:

【参考方案1】:

假设您有名为“A.h5”和“B.h5”的预训练模型文件。您可以简单地在 TensorFlow 中加载它们,使用 layers 属性访问您感兴趣的层,​​并将它们与功能 API 合并。一个例子如下:

import tensorflow as tf 

pretrainedmodel_files = ["A.h5", "B.h5"]

A,B = [tf.keras.models.load_model(filename) for filename in pretrainedmodel_files]

# Skipping the last dense layer and the dropout means accessing the layer at the index -3
concat = tf.keras.layers.Concatenate()([A.layers[-3].output, B.layers[-3].output])
out = tf.keras.layers.Dense(2,activation="sigmoid")(concat)
model = tf.keras.Model(inputs=[A.input, B.input], outputs=out)

我用以下代码创建了两个简单的模型:

tf.keras.Sequential(
        [
            tf.keras.layers.Dense(10, activation="relu", input_shape=(5,)),
            tf.keras.layers.Dropout(0.3),
            tf.keras.layers.Dense(2, activation="sigmoid")
        ]
)

然后将它们与我的示例代码合并在一起。

A 和 B 具有以下架构(使用 netron 进行可视化):

以及合并后的网络:

【讨论】:

太棒了!感谢您的准确回答(以及使用 netron,我会检查一下!)

以上是关于在 keras 的输出阶段组合多个预训练模型的主要内容,如果未能解决你的问题,请参考以下文章

keras中使用预训练模型进行图片分类

在 keras 中微调预训练模型

预训练模型与Keras.applications.models权重资源地址

使用来自 Keras 应用程序的模型,无需预训练权重

keras中的预训练对象检测模型

keras调用预训练模型分类