在keras中连接多个CNN模型

hh *_* tt 3 concatenation deep-learning conv-neural-network keras

我有 8 个 CNN 模型,model1, model2, model3, model4, model5, model6, model7, model8每个模型都有 conv2d、激活、maxpooling、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)        
Run Code Online (Sandbox Code Playgroud)

当我运行该程序时,出现以下错误:

RuntimeError: You must compile your model before using it.
Run Code Online (Sandbox Code Playgroud)

问题是什么?我如何连接、编译、训练?任何人都可以帮助我,任何信息都会有帮助。

Man*_*han 6

从文档中可以看出,“Keras 函数式 API 是定义复杂模型的方法,例如多输出模型、有向无环图或具有共享层的模型。” 所以,使用函数式 API 更好。

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

https://keras.io/getting-started/function-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)
Run Code Online (Sandbox Code Playgroud)