К сожалению, документация довольно ошибочна, но pad_sequences
делает именно то, что вы хотите.Например, этот код
length3 = np.random.uniform(0, 1, size=(3,2))
length4 = np.random.uniform(0, 1, size=(4,2))
pad_sequences([length3, length4], dtype='float32', padding='post')
приводит к
[[[0.0385175 0.4333343 ]
[0.332416 0.16542904]
[0.69798684 0.45242336]
[0. 0. ]]
[[0.6518417 0.87938637]
[0.1491589 0.44784057]
[0.27607143 0.02688376]
[0.34607577 0.3605469 ]]]
Итак, здесь у нас есть две последовательности разной длины, каждый временной шаг имеет две особенности, и в результате получается один массив с нулевыми значениями, гдекороче из двух последовательностей были добавлены нули.
Относительно вашего другого вопроса: по моему опыту, маскировка - сложная тема.Но LSTM должны быть в порядке с этим.Просто используйте слой Masking()
в качестве самого первого.По умолчанию это заставит LSTM игнорировать все нули, поэтому в вашем случае именно те, которые вы добавили с помощью отступов.Но вы можете использовать любое значение для маскировки, также как вы можете использовать любое значение для заполнения.Если возможно, выберите значение, которого нет в вашем наборе данных.
Если вы не используете маскирование, это создаст опасность того, что ваш LSTM узнает, что дополненные значения действительно имеют какое-то значение, хотя в действительности они не имеют't.
Например, если во время обучения вы кормите в последовательности
[[1,2],
[2,1],
[0,0],
[0,0],
[0,0]]
и позже в обученной сети, вы только кормите
[[1,2],
[2,1]]
Youможет получить неожиданные результаты (хотя и не обязательно).Маскировка позволяет избежать этого, исключая маскированное значение из тренировки.