Как решить ошибку «логиты и метки должны иметь одинаковое первое измерение» - PullRequest
0 голосов
/ 24 октября 2019

Я пробую разные архитектуры нейронных сетей для НЛП на основе слов.

До сих пор я использовал двунаправленные, встроенные и модели с GRU, руководствуясь этим руководством: https://towardsdatascience.com/language-translation-with-rnns-d84d43b40571и все получилось хорошо. Однако, когда я попытался использовать LSTM, я получаю сообщение об ошибке:

логиты и метки должны иметь одно и то же первое измерение, иметь форму логитов [32,186] и форму меток [4704]

Как я могу решить это?

Мой исходный и целевой набор данных состоит из 7200 выборочных предложений. Они целочисленные токены и встраиваются. Исходный набор данных пост-дополнен, чтобы соответствовать длине целевого набора данных.

Вот моя модель и соответствующий код:

lstm_model = Sequential()
lstm_model.add(Embedding(src_vocab_size, 128, input_length=X.shape[1], input_shape=X.shape[1:]))
lstm_model.add(LSTM(128, return_sequences=False, dropout=0.1, recurrent_dropout=0.1))
lstm_model.add(Dense(128, activation='relu'))
lstm_model.add(Dropout(0.5))
lstm_model.add((Dense(target_vocab_size, activation='softmax')))

lstm_model.compile(optimizer=Adam(0.002), loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = lstm_model.fit(X, Y, batch_size = 32, callbacks=CALLBACK, epochs = 100, validation_split = 0.25) #At this line the error is raised!

С формами:

  • X.shape = (7200, 147)
  • Y.shape = (7200, 147, 1)
  • src_vocab_size = 188
  • target_vocab_size = 186

Я уже встречался с похожим вопросом здесьи попытался добавить слой Reshape

simple_lstm_model.add(Reshape((-1,)))

, но это вызывает только следующую ошибку:

"TypeError: __int__ вернул не-int (тип NoneType)"

Это действительно странно, так как я предварительно обрабатываю набор данных одинаково для всех моделей, и он работает просто отлично, за исключением вышеперечисленного.

1 Ответ

1 голос
/ 25 октября 2019

Вы должны иметь return_sequences=True и return_state=False для вызова конструктора LSTM.

В вашем фрагменте LSTM возвращает только свое последнее состояние, а не последовательность состояний для каждого вложения ввода. Теоретически вы могли заметить это из сообщения об ошибке:

логиты и метки должны иметь одинаковое первое измерение, иметь форму логитов [32,186] и форму меток [4704]

Логиты должны быть трехмерными: размер партии × длина последовательности × количество классов. Длина последовательностей составляет 147, а на самом деле 32 × 147 = 4704 (количество ваших меток). Это могло бы сказать вам, что длина последовательностей исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...