Есть несколько вещей, которые нужно изменить с первого взгляда.
- Токенизатор должен иметь
num_words = vocab_size
- Сначала (не анализировал это глубоко), я Вы не можете себе представить, почему вы сглаживаете свой набор данных и получаете срезы, если, вероятно, он правильно структурирован
- Вы не можете использовать
stateful=True
, если не хотите, чтобы «партия 2 была продолжением партии 1», вы есть отдельные предложения, поэтому stateful=False
. (Если вы не тренируетесь правильно с циклами ручной тренировки и состояниями сброса для каждой партии, что является ненужной проблемой на этапе обучения)
Что необходимо проверить визуально:
Входные данные должны иметь следующий формат:
[
[1,2,3,6,10,4,10, ...up to sentence length - 1...],
[5,6,3,6,7,3,11,... up to sentence length - 1...],
.... up to number of sentences ...
]
Выходные данные должны быть:
[
[2,3,6,10,4,10,15 ...], #equal to input data, shifted by 1
[6,3,6,7,3,11,13, ...],
...
]
Распечатать несколько строк из них, чтобы проверить, они правильно обработаны, как и предполагалось.
Обучение будет легко:
model.fit(input_data, output_data, epochs=....)
Да, ваша модель будет предсказывать нули, так как в ваших данных есть нули, это не странно: вы сделал pad_sequences
.
Вы можете интерпретировать ноль как «конец предложения» в этом случае, так как вы сделали 'post'
pading. Когда ваша модель дает вам ноль, она решила, что сгенерированное ею предложение должно закончиться в этой точке - если она была хорошо обучена, она, вероятно, продолжит выводить нули для этого предложения с этого момента.
Генерация новых предложений
Эта часть более сложна, и вам нужно переписать модель, теперь имеющую значение stative=True
, и перенести веса из обученной модели в эту новую модель.
Прежде чем что-либо позвонить model.reset_states()
.
Вам нужно будет вручную кормить партию формой (number_of_sentences=batch_size, 1)
. Это будет «первый символ» каждого предложения, которое он сгенерирует. Результатом будет «второй символ» каждого предложения.
Получите этот вывод и подпишите им модель. Он будет генерировать «третий символ» каждого предложения. И так далее.
Когда все выходные значения равны нулю, все предложения полностью сгенерированы, и вы можете остановить l oop.
еще раз позвонить model.reset_states()
, прежде чем пытаться сгенерировать новый пакет предложений.
Примеры такого прогнозирования можно найти здесь: { ссылка }