Ответ 1
-
Наличие LSTM с сохранением состояния в Keras означает, что переменная Keras будет использоваться для хранения и обновления состояния, и на самом деле вы можете проверить значение вектора состояния в любое время (то есть до вы вызываете
reset_states()
). С другой стороны, не-stateful модель будет использовать начальное нулевое состояние каждый раз, когда обрабатывает пакет, так что вы всегда называетеreset_states()
послеtrain_on_batch
,test_on_batch
иpredict_on_batch
. Объяснение о том, что государство будет повторно использоваться для следующей партии на моделях с учетом состояния, - это только различие с неконфессиональными; конечно, состояние всегда будет проходить внутри партии, и вам не нужно иметь партии размером 1 для того, чтобы это произошло. Я вижу два сценария, в которых полезны модели с сохранением состояния:- Вы хотите тренироваться на разделенных последовательностях данных, потому что они очень длинные, и было бы нецелесообразно тренироваться по всей их длине.
- Во время прогнозирования вы хотите получить вывод для каждой временной точки в последовательности, а не только в конце (либо потому, что вы хотите вернуть ее в сеть, либо потому, что это необходимо вашему приложению). Я лично делаю это в моделях, которые я экспортирую для последующей интеграции (которые являются "копиями" учебной модели с размером партии 1).
-
Я согласен, что пример RNN для алфавита на самом деле не очень полезен на практике; он будет работать только тогда, когда вы начинаете с буквы A. Если вы хотите научиться воспроизводить алфавит, начинающийся с любой буквы, вам нужно будет обучить сеть такими примерами (подпоследовательности или вращения алфавита). Но я думаю, что регулярная сеть по пересылке может научиться предсказывать следующую букву обучения алфавитом на таких парах, как (A, B), (B, C) и т.д. Я думаю, что этот пример предназначен для демонстрационных целей больше всего на свете.
-
Возможно, вы, вероятно, уже прочитали его, но популярный пост Неоправданная эффективность повторяющихся нейронных сетей показывает некоторые интересные результаты по строки того, что вы хотите сделать (хотя на самом деле это не особенно важно для реализации). У меня нет личного опыта обучения RNN с текстовыми данными, но есть ряд подходов, которые вы можете исследовать. Вы можете создавать персональные модели (например, те, что находятся в сообщении), где вы вводите и получаете по одному символу за раз. Более продвинутый подход - сделать некоторую предварительную обработку текстов и преобразовать их в последовательности чисел; Keras включает в себя некоторые функции предварительной обработки текста. Наличие одного номера в качестве пространства возможностей, вероятно, не будет работать так хорошо, поэтому вы можете просто превратить каждое слово в вектор с одним горячим кодированием или, что более интересно, чтобы сеть узнала наилучшее векторное представление для каждого, что это то, что они называют en embedding. Вы можете пойти еще дальше с предварительной обработкой и посмотреть на что-то вроде NLTK, особенно если вы хотите удалить стоп-слова, знаки препинания и тому подобное, Наконец, если у вас есть последовательности разных размеров (например, вы используете полные тексты вместо выдержек фиксированного размера, которые могут или не могут быть важны для вас), вам нужно быть более осторожным и использовать masking и/или примерный вес. В зависимости от конкретной проблемы вы можете соответствующим образом настроить обучение. Если вы хотите научиться генерировать похожий текст, "Y" будет похож на "X" (однострочный кодированный), только сдвинутый на одну (или более) позицию (в этом случае вам может понадобиться использовать
return_sequences=True
и TimeDistributed layers). Если вы хотите определить автора, ваш результат может быть softmax Dense layer.
Надеюсь, что это поможет.