TypeError: добавленный слой должен быть экземпляром класса Layer. Найдено: Тензор ("concatenate_6 / concat: 0", shape = (None, 4608), dtype = float32) - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь реализовать модель VQA, в которой я комбинирую изображение и языковую модель. Мое определение модели:

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
   model = Sequential()
   model.add(concatenate([model_language.output, model_image.output]))

   for _ in range(number_of_dense_layers):
       model.add(Dense(number_of_hidden_units, kernel_initializer='uniform', activation= activation_function))
       model.add(Dropout(dropout_pct))

   model.add(Dense(50, activation='softmax'))

   return model

model = VQA_MODEL()
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
model.fit(train_X, train_Y, batch_size = batch_size, epochs=nb_epoch)

Я не могу понять, как устранить ошибку. Любые выводы будут оценены.

1 Ответ

0 голосов
/ 25 марта 2020

Ошибка связана с тем, что 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...