赞
踩
一、Conv2d功能模拟(主要目的是为了帮助理解conv2d的功能)
(2d代表的是二维卷积,1d代表的是一维卷积,以此类推)
1、简介:主要用于实现二维卷积操作。它通常应用于图像处理,特别是在构建卷积神经网络(Convolutional Neural Networks,CNN)时
2、传参:
in_channels
(int):输入通道数。这对应于输入图像的通道数,例如,对于RGB图像,其通道数为3。out_channels
(int):输出通道数。这表示卷积层中卷积核的数量,也决定了输出数据的通道数。kernel_size
(int or tuple):卷积核的大小。可以是一个整数,表示卷积核的高度和宽度相同;也可以是一个元组,如(h, w),分别表示卷积核的高度和宽度。stride
(int or tuple, optional):卷积核移动的步长。默认值为1。和kernel_size
一样,可以是一个整数或元组。padding
(int or tuple, optional):输入的边缘填充大小。可以是一个整数或元组。填充通常用于控制输出特征图的大小。dilation
(int or tuple, optional):卷积核元素之间的间距。默认值为1。groups
(int, optional):控制输入和输出之间的连接。默认值为1。bias
(bool, optional):如果为True,添加偏置项到输出中。默认值为True。padding_mode
(str, optional):填充模式。默认值为'zeros'。举例:以步径为1为例:
计算方式:将卷积核与输入图像进行匹配,然后对应格子上的数相乘,最后九个数相加,每匹配完一次卷积核,卷积核在图像中左右或上下移动一个步径,然后重复上述操作,最终得到卷积后的输出
即:(pytorch官网上是动图:conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic · GitHub)
总代码展示(模仿卷积操作的原理):
- 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]])
-
- #由于输入到conv2d中的图像通常是四维的,因此需要转化一下矩阵格式
- input = torch.reshape(input,(1,1,5,5))
- kernel = torch.reshape(kernel,[1,1,3,3])
-
- # 步径为1测试
- output = F.conv2d(input,kernel,stride = 1)
- print(output)
-
- # 步径为2测试
- output2 = F.conv2d(input,kernel,stride = 2)
- print(output2)
-
- # padding为1测试
- output3 = F.conv2d(input,kernel,stride = 1,padding = 1)
- print(output3)
测试结果:
二、conv2d代码实战:
- import torch
- from torch import nn
- from torch.utils.data import DataLoader
- from torch.utils.tensorboard import SummaryWriter
- import torchvision
-
- trans = torchvision.transforms.ToTensor()
-
- # 获取数据集
- test_data = torchvision.datasets.CIFAR10(root="./dataset2",train=False,transform=trans,download=True)
-
- # 取出数据集中的数据
- data_loader = DataLoader(test_data,batch_size=64,shuffle=True,drop_last=False)
-
- # 将数据进行卷积操作
- class MyModule(nn.Module): # 必须继承系统自带的卷积
-
- def __init__(self):
- super().__init__()
- self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
- # in_channels = 3:因为传入的图片是RGB,所以含有三个通道,因此传入3
- # out_channels = 6:卷积后输出的图片的通道数是6
- # kernel_size=3:卷积核的尺寸
- # stride = 1 : 移动的步长
- # padding : 输入的图片的边缘填充大小
-
- def forward(self,x):
- x = self.conv1(x)
- return x
-
- module = MyModule() # 实例化卷积类
-
- writer = SummaryWriter("test")
-
- step = 0
- for data in data_loader:
- imgs,targets = data
- writer.add_images("正常未卷积",imgs,step)
- output = module(imgs)
- # 由于add_images接受的是tensor类型图片,因此通道也为3,所以需要将卷积后的图片重新设置一下格式
- output = torch.reshape(output,[-1,3,30,30])
- # 第一个参数是batch_size = -1:当不知道第一个参数是多少时,可以填入-1,系统会根据后面三个参
- 数来计算该参数
- # 第二个参数的通道数目,灰度图一般为1,彩色图为RGB三通道,因为设置的卷积后的图片的通道数为6,因此这里需要将图片的通道数变为3
- # 之后的参数是图像的高度和宽度(可能还有深度)
- writer.add_images("卷积",output,step)
- step += 1
-
- writer.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。