Ошибка связана с тем, что concatenate
с маленькой буквой c
не является layer
и только Concatenate
с заглавной буквой c
является слоем. Однако это также не сработает в вашем случае.
Поскольку ваша комбинированная модель не sequential
и использует входные данные от двух параллельных или разных моделей, лучше использовать API Functional
. Следующий код должен работать:
from tensorflow.keras import Sequential, Model
from tensorflow.keras.layers import LSTM, Reshape, Dense, Dropout, concatenate, Concatenate
def VQA_MODEL():
image_feature_size = 4096
word_feature_size = 300
number_of_LSTM = 3
number_of_hidden_units_LSTM = 512
max_length_questions = 30
number_of_dense_layers = 3
number_of_hidden_units = 1024
activation_function = 'tanh'
dropout_pct = 0.5
# Image model
model_image = Sequential()
model_image.add(Reshape((image_feature_size,), input_shape=(image_feature_size,)))
# Language Model
model_language = Sequential()
model_language.add(LSTM(number_of_hidden_units_LSTM, return_sequences=True,input_shape=(max_length_questions, word_feature_size)))
model_language.add(LSTM(number_of_hidden_units_LSTM, return_sequences=True))
model_language.add(LSTM(number_of_hidden_units_LSTM, return_sequences=False))
# combined model
x = Concatenate()([model_language.output, model_image.output])
for _ in range(number_of_dense_layers):
x = Dense(number_of_hidden_units, kernel_initializer='uniform', activation= activation_function)(x)
x = Dropout(dropout_pct)(x)
x = Dense(50, activation='softmax')(x)
model = Model(inputs = [model_language.input, model_image.input], outputs=x)
return model
model = VQA_MODEL()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_X, train_Y, batch_size = batch_size, epochs=nb_epoch)