哔哩大学的PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】
的P17讲讲述了卷积操作的举例使用。
首先,要做的效果如图:一个很简单的输入图像,卷积核首先和输入图像左上角33对齐,然后对应格子相乘,再9个格子相加,即1+22+0*1…如下边第一个式子,得到卷积后的输出的第一个值——10。Stride=1的意思是,卷积核向左移动一个格子,再类似计算得出输出的第二个值——12。
其代码实现为:
import torch
import torch.nn.functional as F
# 卷积函数,即图片中的两个矩阵相乘再相加,1+4+0+0+1+2+2
input = torch.tensor([[1, 2, 0, 3, 1],
[0, 1, 2, 3, 1],
[1, 2, 1, 0, 0],
[5, 2, 3, 1, 1],
[2, 1, 0, 1, 1]])
# 两个中括号说明是二维的矩阵
# 构造输入图像
kernel = torch.tensor([[1, 2, 1],
[0, 1, 0],
[2, 1, 0]])
# 构造卷积核
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
# 一个尺寸变化工具
print(input.shape)# input的尺寸
print(kernel.shape)
output = F.conv2d(input, kernel, stride=1)
print(output)
# 得出的ouput和图片中的卷积后的输出一样
# 当 stride=2 时,即卷积核在输入图像上每次移动两个格
output2 = F.conv2d(input, kernel, stride=2)
print(output2)
# 当 stride=1 、padding = 2 时,即先在输入图像的上下左右先填充一圈0,卷积核在输入图像上每次移动一个格
output3 = F.conv2d(input, kernel, stride=1, padding=1)
print(output3)
padding=1的效果如图,即先在输入图像的上下左右先填充一圈0。
结果如图,和自己计算的效果一样: