У меня возникли некоторые проблемы с пониманием того, как извлечь прогнозы из модели 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-ввод.
Спасибо за помощь!