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)