Прогнозирование следующего слова с помощью Keras: как получить прогноз для каждого входного слова - PullRequest
0 голосов
/ 14 мая 2018

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

Я хочу создать простую систему, которая предсказывает следующее слово, но я не знаю, как вывести полный списоквероятностей для каждого слова.

Это мой код прямо сейчас:

model = Sequential()
model.add(Embedding(vocab_size, embedding_size, input_length=55, weights=[pretrained_weights])) 
model.add(Bidirectional(LSTM(units=embedding_size)))
model.add(Dense(23690, activation='softmax')) # 23690 is the total number of classes 

model.compile(loss='categorical_crossentropy',
          optimizer = RMSprop(lr=0.0005),
          metrics=['accuracy'])

# fit network
model.fit(np.array(X_train), np.array(y_train), epochs=10)
score = model.evaluate(x=np.array(X_test), y=np.array(y_test), batch_size=32)
prediction = model.predict(np.array(X_test), batch_size=32)

Первый вопрос: Набор тренировок: список предложений (векторизованных и преобразованных в индексы).В Интернете я видел несколько примеров, где люди делят X_train и y_train следующим образом:

X, y = sequences[:,:-1], sequences[:,-1]
y = to_categorical(y, num_classes=vocab_size)

Должен ли я вместо этого преобразовать X_train и y_train для получения скользящих последовательностей, где, например, у меня есть

X = [[10, 9, 4, 5]]
X_train = [[10, 9], [9, 4], [4, 5]]
y_train = [[9], [4], [5]]

Второй вопрос: сейчас модель возвращает только один элемент для каждого входа.Как я могу вернуть прогнозы для каждого слова?Я хочу иметь возможность иметь массив выходных слов для каждого слова, а не один выход.Я прочитал, что мог бы использовать слой TimeDistributed, но у меня есть проблемы со входом, потому что слой Embedding принимает 2D-ввод, а TimeDistributed принимает 3D-ввод.

Спасибо за помощь!

1 Ответ

0 голосов
/ 14 мая 2018

Для того, что вы спрашиваете, я не думаю, что двунаправленная сеть была бы хороша. (Обратное направление будет пытаться предсказать что-то, что не появляется в конце, но перед началом, и я полагаю, что вы захотите взять выходные данные и сделать их входными данными и продолжать предсказывать дальше, верно?)

Итак, сначала удалите Bidirectional из вашей модели, оставьте только LSTM.

Повторяющиеся слои Keras могут выводить только последний шаг или, если вы установили return_sequences=True, выводить все шаги.

Итак, хитрость заключается в корректировке данных и модели следующим образом:

  • В слоях LSTM добавьте return_sequences=True. (Ваш вывод будет целыми предложениями)
  • Сделать Y целыми предложениями на шаг впереди X: X,y = sequences[:,:-1], sequences[:,1:]

Просто имейте в виду, что это сделает ваш вывод 3D. Если вас интересует только последнее слово, вы можете вручную взять его из вывода: lastWord = outputs[:,-1]


О раздвижных окнах : не используйте их. Они полностью побеждают цель LSTM, которая изучает длинные последовательности.

О слоях TimeDistributed : используйте их только тогда, когда вы хотите добавить дополнительное измерение времени . Поскольку LSTM уже используют измерение времени, у вас все в порядке без TimeDistributed. Если вы хотите, например, обработать весь текст, и вы решили переходить от предложения к предложению, и внутри каждого предложения слово за словом вы можете попробовать что-то с двумя измерениями времени.

О неопределенном прогнозировании будущего : для этого вам нужно будет использовать stateful=True LSTM-слои и создавать ручные циклы, которые получают последний выходной шаг и подают его в качестве входных данных для выполнения одного еще шаг.

...