我有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)
运行程序时,出现以下错误:
RuntimeError: You must compile your model before using it.
出什么问题了?如何连接,编译和训练?谁能帮助我,任何信息都将对您有帮助。
答案 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)