卷积操作在下面这个包当中,需要先引入包如下:
import torch
import torch.nn.functional as F
视频中用到的是一个二维图片卷积:torch.nn.functional.conv2d
主要的参数如下(来自官方文档):
input:就是我么所输入的图像
weight:权重,用专业术语来说是卷积核
padding:是否扩展,默认为0
有一个5*5的输入图象和3*3的卷积核
输入图像为:
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 |
卷积核为:
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 |
先用手动的方法来实现卷积操作:
当padding为0的时候,把圆圈的的数相乘相加,得到的是卷积结果得第一个数
例如:
然后分别向右或向下移动,以此类推,计算出最终结果为:
10 | 12 | 12 |
18 | 16 | 16 |
13 | 9 | 3 |
如果padding为1,则扩充输入图像为:填充值,默认为1
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 | ||
用代码实现如下
import torch
import torch.nn.functional as F
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]])
kernal= torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])
input =torch.reshape(input,(1,1,5,5))
kernal =torch.reshape(kernal,(1,1,3,3))
print(input.shape)
print(kernal.shape)
output = F.conv2d(input,kernal,padding=0,stride=1)
print(output)
输出结果为:
如过padding的值设为1则输出结果为: