python - 合并不同的CNN模型
问题描述
我们是数据科学的新手,我们正在尝试合并两种不同的 CNN 模型(一个有 2 个类,另一个有 3 个类)。模型的代码是:
性别模型
#initialize the model along with the input shape
model = Sequential()
inputShape = (height, width, depth)
chanDim = -1
if K.image_data_format() == 'channels_first':
inputShape = (depth, height, width)
chanDim = 1
# CONV -> RELU -> MAXPOOL
model.add(Convolution2D(64, (3,3), padding='same', input_shape=inputShape))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# (CONV -> RELU)*2 -> AVGPOOL
model.add(Convolution2D(128, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(Convolution2D(128, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(AveragePooling2D(pool_size=(3,3) ))
model.add(Dropout(0.25))
# CONV -> RELU -> MAXPOOL
model.add(Convolution2D(256, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# CONV -> RELU -> AVGPOOL
model.add(Convolution2D(512, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(AveragePooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# DENSE -> RELU
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
# DENSE -> RELU
model.add(Dense(512))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
# sigmoid -> just to check the accuracy with this (softmax would work too)
model.add(Dense(classes))
model.add(Activation('sigmoid'))
return model
model = build(img_size, img_size, 3, 2)
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
种族模型:
#initialize the model along with the input shape
model = Sequential()
inputShape = (height, width, depth)
chanDim = -1
if K.image_data_format() == 'channels_first':
inputShape = (depth, height, width)
chanDim = 1
# CONV -> RELU -> MAXPOOL
model.add(Convolution2D(64, (3,3), padding='same', input_shape=inputShape))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# (CONV -> RELU)*2 -> AVGPOOL
model.add(Convolution2D(128, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(Convolution2D(128, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(AveragePooling2D(pool_size=(3,3) ))
model.add(Dropout(0.25))
# CONV -> RELU -> MAXPOOL
model.add(Convolution2D(256, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# CONV -> RELU -> AVGPOOL
model.add(Convolution2D(512, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=chanDim))
model.add(AveragePooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
# DENSE -> RELU
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
# DENSE -> RELU
model.add(Dense(512))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
# softmax
model.add(Dense(classes))
model.add(Activation('softmax'))
return model
model = build(img_size, img_size, 3, 3)
model.compile(loss= 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
我们尝试将模型与连接 keras 函数合并,但未能了解如何合并具有不同数量类的两个模型。我们的目标是:给定一张照片,我们想同时预测性别和种族 感谢您的关注。
解决方案
我们称第一个模型model_1
和第二个模型model_2
。您需要做的第一步是将模型的输入更改为一些通用输入。
inputs = keras.layers.Input(shape=inputShape)
outputs_1 = model_1(inputs)
outputs_2 = model_2(inputs
接下来创建具有这些输入和输出的模型
new_model = keras.Model(inputs=inputs, outputs=[outputs_1, outputs_2])
现在模型有一个输入和两个输出。您可以从单个输入中获得两个预测。
修复名称冲突
如果模型具有相同的名称和/或模型的层具有相同名称的层,请使用以下代码重命名模型和模型的层。
model_1._name = "model_1_"+model_1.name
model_2._name = "model_2_"+model_2.name
for layer in model_1.layers:
layer._name = "model_1_layer_"+layer.name
for layer in model_2.layers:
layer._name = "model_2_layer_"+layer.name
推荐阅读
- python - VSCode 的 Eventhub 触发器设置本地开发
- fortran - 在 Win10 上安装 VS 2015 和 Intel Fortran Compiler 2016 但仍然无法正常工作
- c++ - C++:使用缓冲区中的数据填充结构
- javascript - 当用户选择错误的日期时如何显示验证消息?
- dart - 如何在 Flutter 中重建 AnimatedWidget
- python - 对于二进制分类的信息量最大的特征,我的结果是否相同?
- python - Numpy:重塑的数组表现异常
- python - 不能多次使用 PyQt5 进行网络抓取
- webpack - Webpack 配置对象无效。- 'globalObject' 创建 React 应用程序
- javascript - 使用javascript获取每个级别的json值