【问题标题】:Concatenate multiple CNN models in keras在 keras 中连接多个 CNN 模型
【发布时间】:2019-07-24 09:20:46
【问题描述】:

我有 8 个 CNN 模型 model1, model2, model3, model4, model5, model6, model7, model8,每个模型都带有 conv2d、激活、最大池化和 dropout 层。我想将它们的输出连接起来,将其展平,最后编译并使其适合分类目的,如下图:

我对连接、合并和拟合感到困惑。例如,我可以使用 model1.add(Flatten) 单独展平每个模型,然后将它们连接起来,还是我必须连接并展平所有模型?我的python代码如下:

merge = Concatenate([model1, model2, model3, model4, model5, model6, model7, model8])
concat_model = Sequential()
concat_model.add(merge)
concat_model.add(Flatten())
concat_model.add(Dense(128))
concat_model.add(Activation("relu"))
concat_model.add(BatchNormalization())
concat_model.add(Dropout(0.5))

concat_model.add(Dense(classes))
concat_model.add(Activation("softmax"))

concat_model.compile(loss="categorical_crossentropy", optimizer= opt, metrics=["accuracy"])

concat_model.fit_generator(aug.flow(trainX, trainY, batch_size=BS),validation_data=(testX, testY), steps_per_epoch=len(trainX) // BS, epochs=EPOCHS, verbose=1)        

当我运行程序时,我收到以下错误:

RuntimeError: You must compile your model before using it.

有什么问题?我怎样才能连接,编译,训练?任何人都可以帮助我,任何信息都会有所帮助。

【问题讨论】:

    标签: keras deep-learning concatenation conv-neural-network


    【解决方案1】:

    根据文档,“Keras 功能 API 是定义复杂模型的方法,例如多输出模型、有向无环图或具有共享层的模型。”因此,使用函数式 API 会更好。

    https://keras.io/getting-started/functional-api-guide/#shared-vision-model

    https://keras.io/getting-started/functional-api-guide/#visual-question-answering-model

    您可以在单个模型中展平,然后按照上面的示例进行连接。在你的情况下,你最终会得到这样的东西。

    final_model = 模型([input_1, input_2,...input_8], face_probability)

    有两个分支的最小示例:

    from keras.layers import Conv2D, MaxPooling2D, Input, Dense, Flatten, concatenate
    from keras.models import Model
    import numpy as np
    
    digit_a = Input(shape=(27, 27, 1))
    x = Conv2D(64, (3, 3))(digit_a)
    x = Conv2D(64, (3, 3))(x)
    x = MaxPooling2D((2, 2))(x)
    out_a = Flatten()(x)
    
    digit_b = Input(shape=(27, 27, 1))
    x = Conv2D(64, (3, 3))(digit_b)
    x = Conv2D(64, (3, 3))(x)
    x = MaxPooling2D((2, 2))(x)
    out_b = Flatten()(x)
    
    concatenated = concatenate([out_a, out_b])
    out = Dense(1, activation='sigmoid')(concatenated)
    model = Model([digit_a, digit_b], out)
    print(model.summary())
    model.compile('sgd', 'binary_crossentropy', ['accuracy'])
    X = [np.zeros((1,27,27,1))] * 2
    y = np.ones((1,1))
    model.fit(X, y)
    

    【讨论】:

    • 我正在尝试类似的事情,但它需要多个输入,而不是 1 个。我想将 8 个不同的模型组合成 1 个模型,例如,所有模型都有不同的输出,并且想要组合 1 个输出一。
    【解决方案2】:

    回答您无法使用 Tensorflow 2 中的 Keras 来轻松概括使用 2 个模型的示例。您不能在不创建中间模型的情况下连接三个模型。 对于三个模型 model_1、model_2、model_3,您可以这样做:

    # concatenate two models, doesn't three
    concat_a = tf.keras.layers.concatenate([model1.output, 
                                          model2.output])
    model_a = tf.keras.Model([model1.input, model2.input], concat_a)
    
    concat = tf.keras.layers.concatenate([model_a.output, 
                                            model3.output])
    
    dense = tf.keras.layers.Dense(1024)(concat)
    relu = tf.keras.layers.LeakyReLU(alpha=0.3)(dense)
    normalize = tf.keras.layers.BatchNormalization()(relu)
    out = tf.keras.layers.Dense(10, activation='softmax', name='output_layer')(normalize)
    
    # nested list
    model = tf.keras.Model([[model_1.input, model_2.input], model_3.input], out)
    
    model.summary()
    
    optimizer = RMSprop()
    
    model.compile(loss='categorical_crossentropy',
                  optimizer=optimizer,
                  metrics=['accuracy'])
    
    # simple list
    history = model.fit([trainX, trainX, trainX], trainY)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多