【问题标题】:Merge different CNN models合并不同的CNN模型
【发布时间】:2020-12-18 19:52:01
【问题描述】:

我们是数据科学的新手,我们正在尝试合并两种不同的 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'])

我们尝试使用 concatenate keras 函数合并模型,但未能了解如何合并具有不同数量类的两个模型。 我们的目标是:给定一张照片,我们想同时预测性别和种族 感谢您的关注。

【问题讨论】:

  • 请不要使用 cmets 来提供额外的信息 - 而是编辑和更新您的问题。

标签: python tensorflow machine-learning keras conv-neural-network


【解决方案1】:

我们称第一个模型为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

【讨论】:

  • 当我们运行“new_model = keras.Model(inputs=inputs, outputs=[outputs_1, outputs_2])”代码时,它返回这个错误:名称“sequential”在模型中被使用了2次.所有图层名称都应该是唯一的。
  • 您是从文件中加载模型吗?
  • 为了加载我们使用代码 tf.keras.models.load 的模型,在 for 循环中使用用于修复名称冲突的代码,回溯返回:TypeError: 'Sequential' object is not iterable
  • 我已经修好了。
猜你喜欢
  • 2019-11-12
  • 2018-08-07
  • 2020-03-09
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多