Keras LSTM, ожидается 3, но получил массив с формой []

Я пытаюсь найти ярлык, связанный со словом из аннотированного текста. Я использую bidirectional LSTM, я имею X_train которая имеет форму (1676, 39) и Y_train с той же формы (1676, 39).

input = Input(shape=(sequence_length,))
model = Embedding(input_dim=n_words, output_dim=20,
              input_length=sequence_length, mask_zero=True)(input)
model = Bidirectional(LSTM(units=50, return_sequences=True,
                       recurrent_dropout=0.1))(model)
out_model = TimeDistributed(Dense(50, activation="softmax"))(model) 
model = Model(input, out_model)
model.compile(optimizer="rmsprop", loss= "categorical_crossentropy", metrics=["accuracy"])
model.fit(X_train, Y_train, batch_size=32, epochs= 10,
                validation_split=0.1)

При выполнении этого я получаю сообщение об ошибке:

ValueError: Error when checking target: expected time_distributed_5 to have 3 dimensions, but got array with shape (1676, 39).

Я не могу выяснить, как обеспечить правильное измерение, необходимое для модели Keras LSTM.

1 ответ

В LSTM Ты устанавливаешь return_sequences=True В результате на выходе слоя появляется тензор с формой [ batch_size * 39 * 50 ]. Затем вы передаете этот тензор в слой TimeDistributed. TimeDistributed примените Плотный слой к каждой временной отметке. Выходные данные слоя, опять же, [ batch_size * 39 * 50 ]. Как видите, вы передаете 3-х мерный Тензор для предсказания, в то время как ваша основная истина - 2-х мерная (1676, 39).

Как исправить проблему?

1) Удалить return_sequences=True из LSTM args.

2) Удалить TimeDistributed слой и нанесите плотный слой напрямую.

inps = keras.layers.Input(shape=(39,))
embedding = keras.layers.Embedding(vocab_size, 16)(inps)
rnn = keras.layers.LSTM(50)(embedding)
dense = keras.layers.Dense(50, activation="softmax")(rnn)
prediction = keras.layers.Dense(39, activation='softmax')(dense)
Другие вопросы по тегам