pytorch conv1d图解

背景

我看网上,很多人讲解的pytorch的conv1d都讲不清楚。算了。我自己来讲解一遍吧,结合图片来。

1. 简单版本的pytoch的conv1d

创建一个数据

先创建一个简单的数据,这个数据的shape为 (1, 10, 5) ,对应的意义为batch_size, dim1, dim2

注意:

  1. 这里的dim1就是我们下面提到的in_channel
  2. 这里的dim2的意义,先不用管。
data = t.ones(size=(1, 10, 5))
data

数据长成这样:
pytorch conv1d图解_第1张图片

创建conv1d

接下来,创建一个conv1d

conv1d = nn.Conv1d(in_channels=10,
                   out_channels=2,
                   kernel_size=3,
                   stride=1,
                   bias=False, 
                   padding=0)
conv1d.weight.data = t.ones_like(conv1d.weight.data)

为了方便理解,我把上面的卷积里面的权重全部设置为1了。

注意上面的参数

  1. in_channels要和我们上面创建的数据的dim1维度数对应上。
  2. out_cannels这个不用管,设置成一个正整数就行。
  3. kernel_size=3,这个先记住,先不用管。
  4. stride表示的是步长,默认就是1
  5. bias这个先不管。
  6. padding先不管

开始卷积

res = conv1d(data)
res

卷积结果如下:

卷积的shape为:

res.shape

#> torch.Size([1, 2, 3])

可以看出来,卷积之后的结果的shape为(1, 2, 3)

  1. 第一个维度值为1,很好理解,因为我们的data的batch_size就是1, 不可能,你卷积一次,batch_size变化了吧。
  2. 第二个维度值为2,这个2是来自上面我们设置的out_channels。这个说白了,就是做多少次卷积,强调的是次数。
  3. 第三个维度值为3,这个3我们要好好解释一下了。

解释

这里分步骤介绍:

1. 第一步

因为我们设置的是kernel_size=3。且in_channel=10,所以我们的卷积核是(10, 3)
一个窗口在我们数据上(红色块)和我们的卷积核(蓝色块)进行点积。然后求和。这样就得到第一个30.(注意绿色箭头)
pytorch conv1d图解_第2张图片

2. 第二步

接下来,我们那个红色窗口向右边移动一步(因为我们设置的stride=1,所以只移动一步,如果设置为2,那么需要2步)。

  1. 虚线就是上一步窗口所在的位置。
  2. 红框就是这一步窗口所在的位置。
  3. 然后再把红框和蓝框进行点积,然后求和,得到第二个30.(注意绿色箭头)。
    pytorch conv1d图解_第3张图片

3. 第三步

接下来,再把红框向右移动一步。这个时候就顶到右边的边上了。

  1. 虚线就是上一步窗口所在的位置。
  2. 红框就是这一步窗口所在的位置。
  3. 然后再把红框和蓝框进行点积,然后求和,得到第三个30.(注意绿色箭头)。
    pytorch conv1d图解_第4张图片

4. 第四步

因为红框已经顶到右边了,不能再移动了。那就停止了。
这样就把卷积的第一排计算完了。
pytorch conv1d图解_第5张图片

5. 下一步

还记得我们设置的out_channels=2么。

上面几步,就是把第一行计算完了。还差一行。按照上面的步骤,原封不动的再计算一边即可。

总结

上面就是一个最简单的pytorch的conv1d。实际上更加复杂的也就是和上面差不多的。

  1. 注意,我是吧上面的参数都设置为1了,这样方便计算和理解。

你可能感兴趣的:(pytorch,pytorch,深度学习,神经网络)