Keras LSTM, ожидается 3, но получил массив с формой [] - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь найти ярлык, связанный со словом из аннотированного текста.Я использую 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 Ответ

0 голосов
/ 21 сентября 2018

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

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

1) Удалите return_sequences=True из аргументов LSTM.

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)
...