Как conv1d pytorch работает с последовательностью символов или фреймов? - PullRequest
0 голосов
/ 28 мая 2020

Я понимаю фильтры свертки при применении к изображению (например, изображение 224x224 с 3 входными каналами, преобразованное 56 полными фильтрами свертки 5x5 в изображение 224x224 с 56 выходными каналами). Ключ в том, что существует 56 различных фильтров с весами 5x5x3, каждый из которых дает выходное изображение 224x224, 56 (термин после запятой - выходные каналы).

Но я не могу понять, как conv1d фильтр работает в моделях seq2seq с последовательностью символов. Одна из моделей, на которую я смотрел https://arxiv.org/pdf/1712.05884.pdf, имеет слой « пост- net, состоящий из 512 фильтров с формой 5 × 1» , который работает с кадром спектрограммы 80 -d (означает 80 различных значений с плавающей запятой в кадре), а результатом фильтрации является кадр размером 512 d.

  • Я не понимаю, что означает in_channels, out_channels в pytorch conv1d определение, как на изображениях, я могу легко понять, что означают входящие / исходящие каналы, но для последовательности кадров с значениями с плавающей запятой я теряюсь. Что они означают в контексте модели seq2seq, подобной приведенной выше?

  • Как фильтры 512, 5x1 по 80 значениям с плавающей запятой дают 512 значений с плавающей запятой? **

  • Разве фильтр 5x1 при работе с 80 значениями с плавающей запятой не будет просто производить 80 значений с плавающей запятой (просто принимая 5 последовательных значений за раз из этих 80)? Сколько всего весов имеют эти 512 фильтров? **

Слой при печати в pytorch отображается как:

(conv): Conv1d(80, 512, kernel_size=(5,), stride=(1,), padding=(2,))

, а параметры в этом слое отображаются как:

postnet.convolutions.0.0.conv.weight : 512x80x5 = 204800
  • Разве веса в этом слое не должны быть 512 * 5 * 1, поскольку он имеет только 512 фильтров, каждый из которых имеет размер 5x1?

1 Ответ

1 голос
/ 28 мая 2020

Введение

По сути, Conv1d похоже на Conv2d, но вместо «скольжения» прямоугольного окна по изображению (скажем, 3x3 для kernel_size=3) вы «скользите» по вектору (скажем, длины 256) с kernel (скажем, размера 3). Это случай in_channels и out_channels, равного 1, который является базовым c one.

Ниже вы можете увидеть, как Conv1d скользит по 3 in_channels (x-axis, y-axis, z-axis) через seconds шагов.

1D Convolution

Вы можете добавить глубину в ядро ​​(точно так же, как вы сделали для 2D свертка с 5x5x3 кубом), что тоже будет 5x3 (5 - размер ядра, 3 - количество in_channels). Теперь может быть out_channels этих квадратов (например, 56 out_channels), поэтому окончательная полученная последовательность будет 56 x sequence_length.

Вопросы

[...] пост- Слой net состоит из 512 фильтров с формой 5 × 1 ", которые работают с кадром спектрограммы 80-d (означает 80 различных значений с плавающей запятой в кадре), и результатом фильтрации является кадр размером 512 d.

Таким образом, ваш ввод - 80d (вместо 3 осей, как указано выше), kernel_size - то же самое (5), а out_channels - 512. Таким образом, ввод может выглядеть примерно так вот так: [64, 80, 256] (для [batch, in_channels, length]) и вывод будет [64, 512, 256] (при условии, что заполнение 3 использовалось с обеих сторон).

Я не понимаю, что такое in_channels, out_channels означают в определении pytorch conv1d, как и на изображениях, я могу легко понять, что означают входящие / исходящие каналы, но для последовательности кадров значений с плавающей запятой я теряюсь. Что они означают в контексте такой модели seq2seq выше?

Я полагаю, что ответ был дан выше. Основной момент: t Последовательность не является значениями с плавающей запятой! Последовательность может быть любой длины (точно так же, как изображение может иметь любой размер, когда вы передаете его в свертку), здесь in_channels это 80.

Как фильтры 512, 5x1 на 80 значениях с плавающей запятой дают 512 значений с плавающей запятой? **

512 x sequence_length значения создаются на 80 x sequence_length входах.

Разве веса в этом слое не должны быть 512 * 5 * 1, так как он имеет только 512 фильтров, каждый из которых 5x1?

В PyTorch, в вашем случае , гири будут иметь форму torch.Size([512, 80, 5]). Это может быть torch.Size([512, 1, 5]), если у вас один входной канал, но в данном случае их 80.

...