在Keras中串联多个CNN模型

时间:2019-03-02 15:10:59

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

我有8个CNN模型model1, model2, model3, model4, model5, model6, model7, model8,每个模型都具有conv2d,激活,maxpooling和dropout层。我想将它们的输出连接起来,进行展平,最后进行编译和调整以使其能够进行分类,如下图所示:

enter image description here

我在连接,合并和拟合上感到困惑。我是否可以例如通过使用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.

出什么问题了?如何连接,编译和训练?谁能帮助我,任何信息都将对您有帮助。

2 个答案:

答案 0 :(得分:0)

在文档中,“ 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 :(得分:0)

要回答这个问题,您不能在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)