Объединить несколько моделей CNN в керасе - PullRequest
0 голосов
/ 02 марта 2019

У меня есть 8 моделей CNN model1, model2, model3, model4, model5, model6, model7, model8 каждая со слоями conv2d, активация, макспул, выпадение.Я хочу объединить их выходные данные, сгладить их, наконец скомпилировать и приспособить их, чтобы можно было классифицировать цели, как показано на рисунке ниже:

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.

В чем проблема?как я могу объединить, скомпилировать, обучить?Может кто-нибудь, пожалуйста, помогите мне, любая информация будет полезна.

1 Ответ

0 голосов
/ 02 марта 2019

Из документации: «Функциональный API Keras - это способ определения сложных моделей, таких как модели с несколькими выходами, направленные ациклические графы или модели с общими слоями».Таким образом, лучше использовать функциональный 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 = 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...