Я пытаюсь начать изучать RNN и использую Keras. Я понимаю основную предпосылку ванильных слоев RNN и LSTM, но у меня возникают проблемы с пониманием определенного технического аспекта обучения.
В документации keras говорится, что входные данные для слоя RNN должны иметь форму (batch_size, timesteps, input_dim)
. Это говорит о том, что все обучающие примеры имеют фиксированную длину последовательности, а именно timesteps
.
Но это не особенно типично, не так ли? Я мог бы хотеть, чтобы RNN оперировал предложениями различной длины. Когда я тренирую его в каком-то корпусе, я буду кормить его пакетами предложений различной длины.
Я полагаю, что очевидным было бы найти максимальную длину любой последовательности в обучающем наборе и заполнить ее нулями. Но значит ли это, что я не могу делать прогнозы во время теста с длиной ввода больше, чем это?
Это вопрос конкретной реализации Keras, я полагаю, но я также спрашиваю, что люди обычно делают, когда сталкиваются с такой проблемой в целом.
Masking
слой, чтобы игнорироватьОтветы:
Это не совсем правильно, так как это измерение может быть
None
, то есть переменной длины. В пределах одного пакета у вас должно быть одинаковое количество временных шагов (как правило, именно там вы видите 0-заполнение и маскирование). Но между партиями такого ограничения нет. Во время вывода вы можете иметь любую длину.Пример кода, который создает случайные пакеты продолжительности обучения.
И это то, что он печатает. Обратите внимание, что выходные формы
(None, None, x)
указывают на переменный размер пакета и переменный размер временного шага.источник
fit()
мы можем передатьsequence_lenth
параметр, чтобы указать длину последовательности, чтобы исключить ее. Кажется, что генераторный подход не позволяет игнорировать 0 последовательностей?(inputs, targets, sample_weights)
, и вы можете установитьsample_weights
свои 0-пэды на 0. Однако я не уверен, что это будет работать идеально для двунаправленных RNN.model.predict_generator
с тестовым набором. Когда я пытаюсь предсказать с помощью генератора, я получаю ошибку, касающуюся конкатенации (тестовый набор также имеет последовательности переменной длины). Мое решение было использовать стандартmodel.predict
в хакерской манере. Возможно, это было бы лучше для нового вопроса?У @kbrose есть лучшее решение
Обычно это хорошее решение. Может быть, попробуйте максимальную длину последовательности + 100. Используйте все, что лучше всего подходит для вашего приложения.
Не обязательно. Причина, по которой фиксированная длина используется в кератах, заключается в том, что она значительно повышает производительность за счет создания тензоров фиксированных форм. Но это только для тренировок. После тренировки вы выучите вес, подходящий для вашей задачи.
Давайте предположим, что после тренировки в течение нескольких часов вы поймете, что максимальная длина вашей модели не была достаточно большой / маленькой, и теперь вам нужно изменить временные шаги, просто извлечь полученные веса из старой модели, построить новую модель с новыми временными шагами. и ввести изученные веса в него.
Вы, вероятно, можете сделать это, используя что-то вроде:
new_model.set_weights(old_model.get_weights())
Я не пробовал это сам. Пожалуйста, попробуйте и опубликуйте свои результаты здесь для всеобщего блага. Вот несколько ссылок: один два
источник
max length + 100
. Смотрите мой ответ для примера кода.Bidirectional(LSTM)()
иRepeatVector()
слои, и прогнозы вполне жизнеспособны.