神经网络的卷积操作

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

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值