Как вы делаете прогнозы с помощью LSTM с отслеживанием состояния? - PullRequest
0 голосов
/ 16 сентября 2018

Ладно, поэтому я натренировал LSTM с указанием состояния на https://cs.stanford.edu/people/karpathy/char-rnn/shakespear.txt. Кажется, это не слишком плохо с точки зрения точности, но я знаю, что хочу создать свои собственные произведения Шекспира.

Вопрос в том, как мне на самом деле генерировать из него прогнозы?

В частности, форма пакетного ввода модели (128, 128, 63) и форма вывода (128, 128, 63). (Первое число представляет собой размер пакета, второе число представляет собой длину ввода и вывода прогноза, а третье число представляет собой количество различных символов в тексте.)

Например, я бы хотел:

  • Создание различных прогнозов, начиная с пустого текста
  • Создание прогнозов, начиная с небольшого начального текста (например, "PYRULEZ:")

Это должно быть возможно, учитывая, как работают LSTM.

Вот фрагмент кода, используемого для генерации и подгонки модели:

model = Sequential()
model.add(LSTM(dataY.shape[2], batch_input_shape=(128, dataX.shape[1], dataX.shape[2]), return_sequences = True, stateful=True, activation = "softmax"))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['acc'])
model.fit(dataX, dataY, epochs = 1, batch_size = 128, verbose=1, shuffle = False)

Глядя на другие примеры кода, кажется, что мне нужно как-то изменить это, но я не уверен в том, как конкретно.

Я могу включить весь пример кода, если это будет полезно. Он самодостаточен.

1 Ответ

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

Simple.Поместите ваш ввод в model.predict() с соответствующими параметрами (см. Документацию), объедините ввод и вывод (модель прогнозирует последовательные более длинные цепочки).В зависимости от того, как вы организовали обучение, вывод будет добавлять по одному символу за раз.Чтобы быть более точным, если вы тренируете последовательность в последовательность, сдвинутую на единицу, ваша выходная последовательность в идеале будет вашей входной последовательностью, сдвинутой на один элемент;PYRULEZ -> YRULEZ * Следовательно, вам нужно взять последний символ вывода и добавить его в предыдущую (входную) последовательность.

Если вам нужны длинные строки текста, вы можете ограничить длину вашегопоследовательность до некоторого количества символов в цикле.Большая часть долгосрочных зависимостей в тексте передается через вектор состояния ячейки LSTM (не то, с чем вы взаимодействуете).

Псевдокод-ish:

for counter in range(output_length):
    output = model.predict(input_)
    input_ = np.concatenate((input_, output[:,-1,:]), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...