Последовательность заполнения 2D элементов в кератах - PullRequest
0 голосов
/ 11 июня 2019

У меня есть набор выборок, каждая из которых является последовательностью набора атрибутов (например, выборка может содержать 10 последовательностей, каждая из которых имеет 5 атрибутов).Количество атрибутов всегда фиксировано, но количество последовательностей (которые являются временными метками) может варьироваться от выборки к выборке.Я хочу использовать этот набор образцов для подготовки сети LSTM в Керасе к проблеме классификации, и поэтому я должен дополнить размер входных данных для всех образцов серии одинаковыми.Но процессор pad_sequences в керасе получает фиксированное количество последовательностей с переменными атрибутами и дополняет отсутствующие атрибуты в каждой последовательности, в то время как мне нужно добавить больше последовательностей фиксированной длины атрибута в каждую выборку.Поэтому я думаю, что не могу его использовать, и поэтому я добавил свои сэмплы отдельно и сделал единый набор данных, а затем скормил им свою сеть.Но есть ли ярлык с функциями Keras для этого?

Также я слышал о маскировании вводимых данных во время обучения, но я не уверен, действительно ли мне это нужно, так как мой классификатор назначает одну метку класса после обработки всегообразец последовательности.мне это нужно?И если да, не могли бы вы помочь мне с простым примером, как это сделать?

1 Ответ

0 голосов
/ 11 июня 2019

К сожалению, документация довольно ошибочна, но 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может получить неожиданные результаты (хотя и не обязательно).Маскировка позволяет избежать этого, исключая маскированное значение из тренировки.

...