当前位置:   article > 正文

神经网络的卷积操作_卷积神经网络 卷积操作

卷积神经网络 卷积操作

一、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

                总代码展示(模仿卷积操作的原理):

  1. import torch
  2. import torch.nn.functional as F
  3. # 输入图像
  4. input = torch.tensor([[1,2,0,3,1],
  5. [0,1,2,3,1],
  6. [1,2,1,0,0],
  7. [5,2,3,1,1],
  8. [2,1,0,1,1]])
  9. # 卷积核
  10. kernel = torch.tensor([[1,2,1],
  11. [0,1,0],
  12. [2,1,0]])
  13. #由于输入到conv2d中的图像通常是四维的,因此需要转化一下矩阵格式
  14. input = torch.reshape(input,(1,1,5,5))
  15. kernel = torch.reshape(kernel,[1,1,3,3])
  16. # 步径为1测试
  17. output = F.conv2d(input,kernel,stride = 1)
  18. print(output)
  19. # 步径为2测试
  20. output2 = F.conv2d(input,kernel,stride = 2)
  21. print(output2)
  22. # padding为1测试
  23. output3 = F.conv2d(input,kernel,stride = 1,padding = 1)
  24. print(output3)

测试结果:

二、conv2d代码实战:

  1. import torch
  2. from torch import nn
  3. from torch.utils.data import DataLoader
  4. from torch.utils.tensorboard import SummaryWriter
  5. import torchvision
  6. trans = torchvision.transforms.ToTensor()
  7. # 获取数据集
  8. test_data = torchvision.datasets.CIFAR10(root="./dataset2",train=False,transform=trans,download=True)
  9. # 取出数据集中的数据
  10. data_loader = DataLoader(test_data,batch_size=64,shuffle=True,drop_last=False)
  11. # 将数据进行卷积操作
  12. class MyModule(nn.Module): # 必须继承系统自带的卷积
  13. def __init__(self):
  14. super().__init__()
  15. self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
  16. # in_channels = 3:因为传入的图片是RGB,所以含有三个通道,因此传入3
  17. # out_channels = 6:卷积后输出的图片的通道数是6
  18. # kernel_size=3:卷积核的尺寸
  19. # stride = 1 : 移动的步长
  20. # padding : 输入的图片的边缘填充大小
  21. def forward(self,x):
  22. x = self.conv1(x)
  23. return x
  24. module = MyModule() # 实例化卷积类
  25. writer = SummaryWriter("test")
  26. step = 0
  27. for data in data_loader:
  28. imgs,targets = data
  29. writer.add_images("正常未卷积",imgs,step)
  30. output = module(imgs)
  31. # 由于add_images接受的是tensor类型图片,因此通道也为3,所以需要将卷积后的图片重新设置一下格式
  32. output = torch.reshape(output,[-1,3,30,30])
  33. # 第一个参数是batch_size = -1:当不知道第一个参数是多少时,可以填入-1,系统会根据后面三个参
  34. 数来计算该参数
  35. # 第二个参数的通道数目,灰度图一般为1,彩色图为RGB三通道,因为设置的卷积后的图片的通道数为6,因此这里需要将图片的通道数变为3
  36. # 之后的参数是图像的高度和宽度(可能还有深度)
  37. writer.add_images("卷积",output,step)
  38. step += 1
  39. writer.close()

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/787267
推荐阅读
  

闽ICP备14008679号