conv1d pytorch 如何对字符或帧序列进行操作?

Joe*_*ack 3 convolution deep-learning lstm pytorch seq2seq

我理解应用于图像时的卷积滤波器(例如,具有 3 个输入通道的 224x224 图像由 56 个 5x5 转换的总共 56 个滤波器转换为具有 56 个输出通道的 224x224 图像)。关键是有 56 个不同的滤波器,每个滤波器的权重为 5x5x3,最终生成输出图像 224x224, 56(逗号后面的术语是输出通道)。

\n\n

但我似乎无法理解conv1d过滤器在字符序列的 seq2seq 模型中如何工作。我正在查看的模型之一https://arxiv.org/pdf/1712.05884.pdf有一个“ post-net 层由 512 个形状为 5\xc3\x971 的滤波器组成”,在频谱图帧 80-d 上运行(意味着帧中有80个不同的浮点值),过滤的结果是512维的帧。

\n\n
    \n
  • 我不明白in_channels, out_channelspytorch conv1d 定义中的含义,就像在图像中一样,我可以轻松理解通道内/通道外的含义,但对于 80 个浮点值帧的序列,我不知所措。在上面这样的 seq2seq 模型的上下文中它们意味着什么?

  • \n
  • 对 80 个浮点值进行 512、5x1 过滤器如何生成 512 个浮点值?**

  • \n
  • 当对 80 个浮点值进行操作时,5x1 过滤器是否只会产生 80 个浮点值(通过在这 80 个值中一次取 5 个连续值)?这 512 个过滤器总共有多少权重?**

  • \n
\n\n

在 pytorch 中打印时的图层显示为:

\n\n
(conv): Conv1d(80, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n
Run Code Online (Sandbox Code Playgroud)\n\n

该层的参数显示为:

\n\n
postnet.convolutions.0.0.conv.weight : 512x80x5 = 204800\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 该层中的权重不应该是 512*5*1 吗,因为它只有 512 个滤波器,每个滤波器都是 5x1?
  • \n
\n

Szy*_*zke 6

简介说明

\n\n

基本上Conv1d就像,Conv2d但不是在图像上“滑动”矩形窗口(例如3x3) ,而是用(kernel_size=3例如 size )“滑动”矢量(例如length )。这是基本情况,并且等于。256kernel3in_channelsout_channels1

\n\n

下面您可以看到跨步骤在in_channels ( , , )Conv1d上滑动。3x-axisy-axisz-axisseconds

\n\n

一维卷积

\n\n

您可以向内核添加深度(就像对2D立方体卷积所做的那样5x5x3),这也是5x3如此(5是内核大小,3是 的数量in_channels)。现在可能存在out_channels这些方块(例如56out_channels),因此最终产生的序列是56 x sequence_length

\n\n

问题

\n\n
\n

[...] post-net 层由 512 个形状为 5\xc3\x971" 的滤波器组成,\n 在频谱图帧 80-d 上运行(意味着帧中有 80 个不同的浮点值\n),并且结果为过滤器是一个512维的框架。

\n
\n\n

所以你的输入是80d(而不是像3上面那样的轴),kernel_size是相同的(5)和out_channels512。所以输入可能看起来像这样:[64, 80, 256](for [batch, in_channels, length]) 和输出将是(假设两边都使用了[64, 512, 256]填充)。3

\n\n
\n

我不明白 in_channels、out_channels 在 pytorch\n conv1d 定义中的含义,就像在图像中一样,我可以轻松理解 \n in-channels/out-channels 的含义,但对于 80 浮点值序列\n 帧 I\'米亏了。在像上面这样的 seq2seq 模型的上下文中它们意味着什么?

\n
\n\n

我想上面已经回答了。要点是:序列不是 80 个浮点值!序列可以是任意长度(就像将图像传递给卷积时图像可以是任意大小一样),这里in_channels80

\n\n
\n

对 80 个浮点值进行 512、5x1 过滤器如何生成 512 个浮点值?**

\n
\n\n

512 x sequence_length值是根据80 x sequence_length输入产生的。

\n\n
\n

该层中的权重不应该是 512*5*1,因为它只有 512 个过滤器,每个过滤器都是 5x1?

\n
\n\n

在 PyTorch 中,就你的情况而言,权重的形状为 shape torch.Size([512, 80, 5])。如果您有一个输入通道,则可能是这样torch.Size([512, 1, 5]),但在本例中,有80多个输入通道。

\n