nn.Conv1d

Conv1d

参数解释

Pytorch官方文档

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

  • in_channels: 输入词向量的维度
  • out_channels: 输出词向量的维度
  • kernel_size: 卷积核大小
  • stride: 步长
  • padding: 是否进行填充,这里在词的两边分别填充padding的大小
  • groups: 这个就是分组卷积的意思,和二维卷积的一样

实例演示

talk is cheap, show me your code

1. 第一个例子

下面直接看一组例子来理解,二维卷积一般用在图像中,一维卷积更多的用在NLP领域,也就是词向量中

1
2
3
4
5
6
7
x = torch.randn(1, 8, 6)
m = nn.Conv1d(8, 16, 3, padding=2)
y = m(x)

'''
torch.Size([1, 16, 8])
'''

假设我们的词的个数为6,向量维度为8,即一句话一共有6个词,每个词被编码为8维度的向量。我们的1d卷积第一个参数为输入词向量的维度,即8;第二个为输出维度为16,即一共有16个卷积核;第三个参数为卷积核的大小为3,卷积核有两个维度,第二个维度由词向量维度来决定,因为词向量维度为8,所以卷积核大小为;第四个参数为padding,如下图,这里padding为2,则向词的两边分别填充2

2. 第二个例子

下面看一下group参数的作用

1
2
3
4
5
6
7
x = torch.randn(1, 8, 6)
n = nn.Conv1d(8, 16, 3, padding=2, groups=2)
z = n(x)

'''
torch.Size([1, 16, 8])
'''

这里我们仅仅加入一个groups=2,所得结果与上述结果相同,由之前的二维卷积可以分析出,group=2参数表明不对所有维度同时进行卷积,即这里的卷积核不是,而是将维度分为两份,这样卷积核的大小就是,相当于卷积核变小了。如下图所示,本来卷积得到的结果需要对所有维度进行操作,这里分成了两份,相当于把词向量的维度首先分成了两份,然后对两份分别操作,这样的好处可以节省参数,即一共需要个参数,这里的第一个2表示分为两份,后面的8,3,4分别表示8个卷积核,每个卷积核的大小为,而例一中需要个参数,是之前的两倍