一、官方文档
torch.nnhttps://pytorch.org/docs/stable/nn.html#convolution-layers
nn.Conv2d用的比较多
二、手动计算卷积操作
三、编写代码
导入相关包
import torch
import torch.nn.functional as F
初始化输入图像 input
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
kernel = torch.tensor([[1, 2, 1],
[0, 1, 0],
[2, 1, 0]])
打印input和kernel的shape
print(input.shape)
print(kernel.shape)
输出结果如下
torch.Size([5, 5])
torch.Size([3, 3])
但是官网给的说明,要求input size和output size如下(C是通道数)
所以接下来要修改input和kernel的size
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
再次打印二者的size,符合要求:
torch.Size([1, 1, 5, 5])
torch.Size([1, 1, 3, 3])
最后,使用conv2d进行卷积操作
output = F.conv2d(input, kernel, stride=1)
完整代码如下:
# -*- coding: utf-8 -*-
# @Time: 2022/6/29 0029 11:05
# @Author: Wang
# @File: demo7_nn_conv.py
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]])
# 初始化卷积核
kernel = torch.tensor([[1, 2, 1],
[0, 1, 0],
[2, 1, 0]])
# 修改input 和 kernel的shape格式
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
# 打印出shape
print(input.shape)
print(kernel.shape)
# 进行卷积操作
output = F.conv2d(input, kernel, stride=1)
# 输出卷积操作结果
print(output)
卷积操作结果如下:
tensor([[[[10, 12, 12],
[18, 16, 16],
[13, 9, 3]]]])
发现,通过代码进行卷积操作的结果,和我们手动计算的结果是一致的。