1、需要安装Pytorch依赖
2、官方文档conv2d
3、图片需要CIFAR10数据集
将原始二维数据,通过卷积核进行运算,得到运算结果,具体运算步骤:
通过卷积核,覆盖输入数据,将选中的数据进行相乘后再相加,则得到输出数据
反复计算到最后,得到输出结果
这里只是在卷积核安全覆盖在原始图像上时才进行计算,但也可以继续向四周移动,不是完全覆盖,只要有覆盖即可计算,多出的地方补0即可;
这里也是左右上下移动都是一格一格移动,也可以每次移动两格;
上面说的两种情况,是conv2d中的padding参数和stride参数不是默认值的情况
函数原型:
参数要求:
最新官网上面要求输入数据为int就行了,这是针对图片数据,在数组数据中,需要tensor数据类型,详细区别见如下例子
代码:
import torch
import torchvision
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]])
print("原始input shape",input.shape) # torch.Size([5, 5])
input = torch.reshape(input,(1,1,5,5)) # 进行格式转换,添加前面两个参数,batchsize=1,channel=1,数据是5*5 torch.Size([1, 1, 5, 5])
print("torch.shape后的shape",input.shape)
# 卷积核
kernel = torch.tensor([[1,2,1],
[0,1,0],
[2,1,0]])
kernel = torch.reshape(kernel,(1,1,3,3))
# 默认卷积使用,padding=0,stride=1
output1 = F.conv2d(input,kernel)
print("默认卷积",output1)
# padding = 1,stride = 1
output2 = F.conv2d(input,kernel,padding = 1,stride = 1)
print("padding = 1,stride = 1",output2)
# padding =1,stride = 2
output3 = F.conv2d(input,kernel,padding =1,stride = 2)
print("padding =1,stride = 2",output3)
代码:
import torch
from torch import nn
from torch.nn import Conv2d
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# download=False,我这里的数据集已经下载好了,就不用每次运行的时候都下载一次,可以在第一次的时候,改为True进行下载
# "./datasetvision"为存放路径
# transform=torchvision.transforms.ToTensor() 将图片数据使用torchvision进行格式转换
dataset = torchvision.datasets.CIFAR10("./datasetvision",train=False,
transform=torchvision.transforms.ToTensor(),download=False)
# 数据预处理,batch_size=64表明每次获取的数据个数为64张
dataloader = DataLoader(dataset,batch_size=64)
# 简单神经网络定义
class ConNet(nn.Module):
def __init__(self):
super(ConNet, self).__init__()
# 输入通道 因为是彩色图像RGB 所以输入通道是3层,输出6层,卷积层是3*3
self.conv2d = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
#定义具体函数体
def forward(self,x):
result = self.conv2d(x)
return result
Work = ConNet()
print(Work) # 打印一下神经网络结构: ConNet((conv2d): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1)))
# 使用tensorboard进行文件夹命名
write = SummaryWriter("logsConv2d")
# data是dataloader中的元组
step = 0
for data in dataloader:
imgs,target = data
# print("原始图像",imgs.shape) #前后差异
# print(output.shape)
write.add_images("input",imgs,step) # 将初始图像放入tensorboard进行对比
output = Work(imgs) # 进行图像卷积
output = torch.reshape(output,(-1,3,30,30)) # 这里因为卷积的时候,将输出通道定义为6个通道,board不知道如何展示,所以使用reshape进行转换
write.add_images("output",output,step)
step = step+1
write.close()