Поддерживает ли сверточный одномерный слой последовательности переменной длины?

У меня есть серия обработанных аудиофайлов, которые я использую в качестве входных данных для CNN с помощью Keras. Поддерживает ли сверточный слой Keras 1D последовательности переменной длины? В документации Keras это неясно.

https://keras.io/layers/convolutional/

В верхней части документации упоминается, что вы можете использовать (None, 128) для последовательностей переменной длины из 128-мерных векторов. Тем не менее, внизу он объявляет, что входная форма должна быть

3D tensor with shape: (batch_size, steps, input_dim)

Учитывая следующий пример, как мне вводить последовательности переменной длины в сеть

Допустим, у меня есть два примера (a и b), содержащих X 1-мерных векторов длиной 100, которые я хочу передать в слой 1DConv в качестве входных данных.

a.shape = (100, 100)
b.shape = (200, 100)

Могу ли я использовать форму ввода (2, Нет, 100)? Мне нужно объединить эти тензоры в c, где

c.shape = (300, 100)

Затем измените его, чтобы он был чем-то

c_reshape.shape = (3, 100, 100)

Где 3 - это размер пакета, 100 - это количество шагов, а вторые 100 - это размер ввода? Документация по входному вектору не очень ясна.


person JME    schedule 30.11.2017    source источник


Ответы (1)


Keras поддерживает переменную длину, используя None в соответствующем измерении при определении модели.

Обратите внимание, что часто input_shape относится к форме, без размера пакета.

Итак, трехмерный тензор с формой (batch_size, steps, input_dim) идеально подходит для модели с input_shape=(steps, input_dim).

Все, что вам нужно, чтобы эта модель принимала переменную длину, - это использовать None в размере шагов:

input_shape=(None, input_dim)

Ограничение числа

Теперь существует ограничение numpy на переменную длину. Вы не можете создать массив numpy с формой, подходящей для переменной длины.

Доступно несколько решений:

  • Добавляйте в последовательности фиктивные значения, пока все они не достигнут одинакового размера, чтобы вы могли поместить их в массив из множества фигур (batch_size, length, input_dim). Используйте Masking слоев, чтобы не принимать во внимание фиктивные значения.
  • Тренируйтесь с отдельными множественными массивами формы (1, length, input_dim), каждый из которых имеет свою длину.
  • Сгруппируйте изображения по размеру в более мелкие массивы.

Будьте осторожны со слоями, которые не поддерживают переменные размеры

В сверточных моделях, использующих переменные размеры, вы не можете, например, использовать Flatten, результат сглаживания имел бы переменный размер, если бы это было возможно. И следующие Dense слои не смогут иметь постоянное количество весов. Это невозможно.

Итак, вместо Flatten вы должны начать использовать слои GlobalMaxPooling1D или GlobalAveragePooling1D.

person Daniel Möller    schedule 30.11.2017
comment
Замечательный ответ. Не могли бы вы также ответить на мой аналогичный вопрос по этому поводу: stackoverflow.com/questions/60911818/, я новичок в keras. - person Rehan; 29.03.2020