在keras中连接多个CNN模型

在keras中连接多个CNN模型,keras,deep-learning,concatenation,conv-neural-network,Keras,Deep Learning,Concatenation,Conv Neural Network,我有8个CNN模型,分别为模型1、模型2、模型3、模型4、模型5、模型6、模型7、模型8,每个模型都有conv2d、激活、最大池和退出层。我希望将它们的输出连接起来,将其展平,最后进行编译并使其适合于分类目的,如下图所示: 我对连接、合并和拟合感到困惑。例如,我可以使用model1.add(flatte)单独展平每个模型并将它们连接起来,还是必须连接并展平所有模型?我的python代码如下: merge = Concatenate([model1, model2, model3, model4

我有8个CNN模型,分别为模型1、模型2、模型3、模型4、模型5、模型6、模型7、模型8,每个模型都有conv2d、激活、最大池和退出层。我希望将它们的输出连接起来,将其展平,最后进行编译并使其适合于分类目的,如下图所示:

我对连接、合并和拟合感到困惑。例如,我可以使用
model1.add(flatte)
单独展平每个模型并将它们连接起来,还是必须连接并展平所有模型?我的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函数API是定义复杂模型的方法,例如多输出模型、有向无环图或具有共享层的模型。”因此,使用函数API更好

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

最终模型=模型([输入1,输入2,…输入8],面概率)

具有两个分支的最小示例:

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)

要回答这个问题,你不能用Tensorflow 2中的Keras轻松地用2个模型概括这个例子。如果不创建中间模型,则不能连接三个模型。 使用三个模型,模型1、模型2、模型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)


我正在尝试类似的事情,但它需要多个输入,而不是1。我想把8个不同的模型组合成一个模型,所有的模型都有不同的输出,例如,我想把一个组合成一个输出。