1 torch.nn.Conv1d

torch.nn.Conv1d主要是对一维输入Tensor应用一维卷积。

如果一维卷积输入为(N,C_{in},L),输出为(N,C_{out},L_{out}),那么这两者的关系可描述为

\operatorname{out}\left(N_{i}, C_{\text {out }_{j}}\right)=\operatorname{bias}\left(C_{\text {out }_{j}}\right)+\sum_{k=0}^{C_{i n}-1} \text { weight }\left(C_{\text {out }_{j}}, k\right) \star \operatorname{input}\left(N_{i}, k\right)

其中\star为cross-correlation算子,N为batch size,C为输入通道数,L为输入序列的长度。

1.1 torch.nn.Conv1d

形式

torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')

参数

  • in_channels(int):输入的特征维度
  • out_channels(int):输出的特征维度
  • kernel_size(int或者tuple):卷积核的大小
  • stride(int或者tuple):默认值为1,卷积的步幅
  • padding(int或者tuple):默认值为0,添加到输入两侧的零填充数量
  • padding_mode(字符串):默认值为"zeros",可选值为"zeros"、"reflect"、"replicate"、“circular”
  • dilation(int或者tuple):内核元素之间的间距
  • groups(int):默认值为1,从输入通道到输出通道的阻塞连接数
  • bias(bool):默认值为True,如果为True,则向输出添加可学习的偏差。

可以通过这个链接https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md查看stride、padding、dilation等参数对卷积过程的影响。

输入与输出维度

一般,输入输出具有以下维度

  • Input:(N,C_{in},L_{in})
  • Output:(N,C_{out},L_{out})

其中,L_{out}可通过以下公式计算

L_{\text {out }}=\left\lfloor\frac{L_{\text {in }}+2 \times \text { padding }-\text { dilation } \times(\text { kernelsize }-1)-1}{\text { stride }}+1\right\rfloor

1.2 torch.nn.Conv1d的简单使用

假设有batch_size为8,input_channels 特征维度为16,长度为50的输入序列,然后使用卷积核大小为3,卷积步幅为2,padding为0的一维卷积层对该输入序列进行一维卷积。

从1.1节中我们知道,torch.nn.Conv1d的输入输出的维度为:

  • Input:(N,C_{in},L_{in})
  • Output:(N,C_{out},L_{out})

那么按照上述描述,N为batch size的大小即为8,C_{out}被指定为33,而

\begin{aligned}
L_{out} & = \left \lfloor \frac{50 + 2 \times 0 - 1 \times (2 - 1) -1 }{2} + 1 \right \rfloor \\
L_{out} & = \left \lfloor 24.5 \right \rfloor \\
L_{out} & = 24
\end{aligned}

从而得出Output的输出维度为(8,33,24)

pytorch代码实现如下:

import torch

if __name__ == '__main__':
    input = torch.randn(8, 16, 50)
    conv1d = torch.nn.Conv1d(16, 33, 3, stride=2)
    output = conv1d(input)

    print(output.shape)

输出

torch.Size([8, 33, 24])