nn.Conv1d
下面我们以一个具体例子来详细讲解 Conv1d 在这种数据形状下的计算过程。假设我们的输入数据、卷积核权重及偏置如下:
示例设定
-
输入张量:
形状为 ([(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 个特征。 -
卷积层设置:
定义conv1 = nn.Conv1d(in_channels, hidden_features, kernel_size=1)
我们设:in_channels = d_model = 3hidden_features = 2(输出通道数为2)kernel_size = 1
并假定偏置都设为 0(便于计算)。
-
卷积核权重:
卷积层的权重张量形状为 ((out_channels, in_channels, kernel_size) = (2, 3, 1))
我们手动指定权重为:- 对于第一个输出通道(Filter 0):
[
W_0 = [1,\ 2,\ 3]
] - 对于第二个输出通道(Filter 1):
[
W_1 = [4,\ 5,\ 6]
]
- 对于第一个输出通道(Filter 0):
计算步骤
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, 4, 3))
- 转置后形状: ((1, 3, 4)) ——满足 Conv1d 的 ([N, C, L]) 要求。
- 1×1 卷积: 对每个位置独立地对 3 个通道做线性组合,输出 2 个通道。
- 详细计算: 对每个位置分别用两个不同的卷积核计算出输出值,得到最终输出形状 ((1, 2, 4))。
这样,我们就完整演示了从输入数据到经过 Conv1d 层计算的每一步骤。希望这个详细例子能帮助你理解整个计算过程!
在1d卷积中,输出通道数=卷积核个数,输入通道数=每个卷积核的最后一个维度的数字

浙公网安备 33010602011771号