nn.Conv1d

下面我们以一个具体例子来详细讲解 Conv1d 在这种数据形状下的计算过程。假设我们的输入数据、卷积核权重及偏置如下:


示例设定

  1. 输入张量:
    形状为 ([(batch \times ts_d),\ seg_num,\ d_model] = (1, 4, 3))
    其中:

    • (batch \times ts_d = 1)
    • (seg_num = 4)(块数量)
    • (d_model = 3)(嵌入维度,也就是输入通道数)

    假设输入数据为:
    [
    x = \begin{bmatrix}
    [1,, 2,, 3],\[5pt]
    [4,, 5,, 6],\[5pt]
    [7,, 8,, 9],\[5pt]
    [10,, 11,, 12]
    \end{bmatrix}
    ]
    这里的每一行对应一个“块”,每个块有 3 个特征。

  2. 卷积层设置:
    定义 conv1 = nn.Conv1d(in_channels, hidden_features, kernel_size=1)
    我们设:

    • in_channels = d_model = 3
    • hidden_features = 2(输出通道数为2)
    • kernel_size = 1
      并假定偏置都设为 0(便于计算)。
  3. 卷积核权重:
    卷积层的权重张量形状为 ((out_channels, in_channels, kernel_size) = (2, 3, 1))
    我们手动指定权重为:

    • 对于第一个输出通道(Filter 0):
      [
      W_0 = [1,\ 2,\ 3]
      ]
    • 对于第二个输出通道(Filter 1):
      [
      W_1 = [4,\ 5,\ 6]
      ]

计算步骤

1. 初始输入形状

初始输入 (x) 的形状为 ((1, 4, 3)) ,即
[
x = \begin{bmatrix}
[1,, 2,, 3] \
[4,, 5,, 6] \
[7,, 8,, 9] \
[10,, 11,, 12]
\end{bmatrix}
]
这里,轴含义为:

  • 轴0:样本数量(1个样本)
  • 轴1:块(seg_num = 4)
  • 轴2:特征(d_model = 3,即通道数)

2. 转置操作

forward 函数中,执行 x = x.transpose(1, 2),将输入的轴1和轴2互换,使得形状变为 ((1, 3, 4))。
转换后的张量记为 (x_t),其各维含义为:

  • 轴0:样本数(1)
  • 轴1:通道数(3,对应 d_model)
  • 轴2:序列长度(4,对应 seg_num)

转换后的具体数据为:
[
x_t[0,0,:] = [1,, 4,, 7,, 10] \quad \text{(原来第1列)}
]
[
x_t[0,1,:] = [2,, 5,, 8,, 11] \quad \text{(原来第2列)}
]
[
x_t[0,2,:] = [3,, 6,, 9,, 12] \quad \text{(原来第3列)}
]

3. 1×1 卷积计算

对于 Conv1d 的 1×1 卷积操作,由于 kernel_size=1,在序列上每个位置都独立进行计算。也就是说,对每个位置 (i)(共4个位置),计算公式为:
[
y[:, j, i] = \sum_{c=0}^{2} x_t[:, c, i] \times W_{j,c} + b_j
]
其中:

  • (j) 表示输出通道索引(这里 j=0,1)
  • (c) 表示输入通道索引(c=0,1,2)
  • (W_{j,c}) 是对应卷积核中的权重
  • (b_j) 是对应输出通道的偏置(这里设为0)

我们依次计算每个位置的输出:

位置 0(序列位置 i=0):

输入数据 (x_t[0,:,0]):

  • 通道0:1
  • 通道1:2
  • 通道2:3

Filter 0(权重 [1,2,3]):
[
y[0,0,0] = 1 \times 1 + 2 \times 2 + 3 \times 3 = 1 + 4 + 9 = 14
]

Filter 1(权重 [4,5,6]):
[
y[0,1,0] = 1 \times 4 + 2 \times 5 + 3 \times 6 = 4 + 10 + 18 = 32
]

位置 1(i=1):

输入数据 (x_t[0,:,1]):

  • 通道0:4
  • 通道1:5
  • 通道2:6

Filter 0:
[
y[0,0,1] = 4 \times 1 + 5 \times 2 + 6 \times 3 = 4 + 10 + 18 = 32
]

Filter 1:
[
y[0,1,1] = 4 \times 4 + 5 \times 5 + 6 \times 6 = 16 + 25 + 36 = 77
]

位置 2(i=2):

输入数据 (x_t[0,:,2]):

  • 通道0:7
  • 通道1:8
  • 通道2:9

Filter 0:
[
y[0,0,2] = 7 \times 1 + 8 \times 2 + 9 \times 3 = 7 + 16 + 27 = 50
]

Filter 1:
[
y[0,1,2] = 7 \times 4 + 8 \times 5 + 9 \times 6 = 28 + 40 + 54 = 122
]

位置 3(i=3):

输入数据 (x_t[0,:,3]):

  • 通道0:10
  • 通道1:11
  • 通道2:12

Filter 0:
[
y[0,0,3] = 10 \times 1 + 11 \times 2 + 12 \times 3 = 10 + 22 + 36 = 68
]

Filter 1:
[
y[0,1,3] = 10 \times 4 + 11 \times 5 + 12 \times 6 = 40 + 55 + 72 = 167
]


4. 最终输出

将所有位置的计算结果组合后,最终输出 (y) 的形状为 ((1, 2, 4)):
[
y = \begin{bmatrix}
\text{Filter 0}: & [14,\ 32,\ 50,\ 68] \
\text{Filter 1}: & [32,\ 77,\ 122,\ 167]
\end{bmatrix}
]
也可以理解为:

  • 每个样本经过 1×1 卷积后,每个序列位置都产生了 2 个特征(由两个卷积核决定)。

总结

  1. 输入形状: ((1, 4, 3))
  2. 转置后形状: ((1, 3, 4)) ——满足 Conv1d 的 ([N, C, L]) 要求。
  3. 1×1 卷积: 对每个位置独立地对 3 个通道做线性组合,输出 2 个通道。
  4. 详细计算: 对每个位置分别用两个不同的卷积核计算出输出值,得到最终输出形状 ((1, 2, 4))。

这样,我们就完整演示了从输入数据到经过 Conv1d 层计算的每一步骤。希望这个详细例子能帮助你理解整个计算过程!


在1d卷积中,输出通道数=卷积核个数,输入通道数=每个卷积核的最后一个维度的数字

posted @ 2025-03-28 16:15  saulstavo  阅读(74)  评论(0)    收藏  举报