在 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 的输出阶段组合多个预训练模型的主要内容,如果未能解决你的问题,请参考以下文章