• 八、卷积层


    一、Conv2d

    torch.nn.Conv2d官网文档
    torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)

    参数解释官网详情说明
    in_channels输入的通道数,如果是彩色照片通道数(RGB)就是3(int) – Number of channels in the input image
    out_channels输出的通道数。若输入为一张单通道的灰度图像,输出通道设置为2,则卷积层会提供2个卷积核(不一定完全相同)来分别对这个单通道图像进行卷据操作,得到2张特征图(int) – Number of channels produced by the convolution
    kernel_size卷积核的大小,可以输入一个整数或者一个元组(int or tuple) – Size of the convolving kernel
    stride卷积的过程中移动的步数(int or tuple, optional) – Stride of the convolution. Default: 1
    padding是否对原始图像进行加边操作(int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0
    dilation卷积核对应位置的距离,卷积的各个元素之间具有位置,并非全部相邻(int or tuple, optional) – Spacing between kernel elements. Default: 1
    groups分组卷积,一般都是设置为1,几乎不用分组卷积(int, optional) – Number of blocked connections from input channels to output channels. Default: 1
    bias偏置,常设置为True,也就是最后加个常数进行微调(bool, optional) – If True, adds a learnable bias to the output. Default: True
    padding_mode在padding进行加边操作的时候,需要加的内容是啥,一般都是zero 全填充0(string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’

    相关参数设置的演示,需要科学上网,懂得都懂

    二、代码演示

    import torch
    import torchvision
    from torch import nn
    from torch.nn import Conv2d
    from torch.utils.data import DataLoader
    from torch.utils.tensorboard import SummaryWriter
    
    dataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)
    #下载CIFAR10数据集到CIFAR_10文件夹下,train=False下载测试集,transform=torchvision.transforms.ToTensor()对数据进行转换为tensor类型,download=True若没有则下载数据集
    
    dataloader = DataLoader(dataset=dataset_test,batch_size=32)
    #dataset=dataset_test指定装载的数据集为dataset_test也就是CIAFAR10数据集中的测试集;batch_size=32每32张为一组
    
    class Beyond(nn.Module):
        def __init__(self):
            super(Beyond, self).__init__()
            self.conv2d_1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=1)
            #in_channels=3输入的3通道的彩色图片
            #out_channels=6输出为通过卷积之后得到的6通道的特征图
            #kernel_size=3卷积核的大小为(3,3)
            #stride=1每一步进行(1,1)的移动
            #padding=1为了防止卷积之后的特征图大小变化,这里向图片的加了一圈边
    
        def forward(self,input):
            result = self.conv2d_1(input)#对传入的input数据进行卷积,卷积的配置在__init__中进行定义
            return result
    
    beyond = Beyond()
    print(beyond)
    """
    Beyond(
      (conv2d_1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))#也就是__init__中的定义
    )
    """
    
    writer = SummaryWriter("y_log")#准备上传至tensorboard
    
    
    i = 0
    for data in dataloader:
        imgs,targets = data
        output = beyond(imgs)
        #print(imgs.shape)#torch.Size([32, 3, 32, 32])
        #print(output.shape)#torch.Size([32, 6, 32, 32])
        #原始的数据为[32, 3, 32, 32],[batch,channel,H,W]
        #卷积之后变成了6通道,故需要转换输出数据
        output = torch.reshape(output,(-1,3,32,32))#这里的channel为3,而batch为-1表示:输出就为3个,剩下的往batch上加,相当于多来几组
    
    
        writer.add_images("input_CIFAR10",imgs,i)
        writer.add_images("output_CIFAR10",output,i)
        i = i + 1
    
    writer.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在Terminal下运行tensorboard --logdir=y_log --port=7870,logdir为打开事件文件的路径,port为指定端口打开;
    通过指定端口2312进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
    在这里插入图片描述
    点击该链接或者复制链接到浏览器打开即可
    input_CIFAR10为32张一组,而output_CIFAR10则不一样
    原因是在神经网络模型构建的时候Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=1),输入3通道,卷积操作之后输出6通道
    因为通道数的不同,无法上传至tensorboard展示,故又通过torch.reshape(output,(-1,3,32,32))对output进行了转换下格式,其中(-1,3,32,32),out_channels将强制转换为3,而因为是-1故需要将多余的通过batch进行扩展,也就是增加每组图片的数量,故在tensorboard中显示的时候input和output显示的每组数量不一样。
    在这里插入图片描述

  • 相关阅读:
    H5营销观察:H5破圈传播有什么秘诀
    2023沈阳建筑大学计算机考研信息汇总
    java线程和go协程
    java-net-php-python-ssmKTV点歌系统查重PPT计算机毕业设计程序
    MySQL InnoDB 引擎底层解析(三)
    Python开源项目周排行 2023年第34周
    python趣味编程-5分钟实现一个简单弹跳球游戏(含源码、步骤讲解)
    点云从入门到精通技术详解100篇-基于全景图的室内场景点云补全方法(续)
    vue+element下日期组件momentjs转换赋值问题
    Strassen矩阵乘法问题(Java)
  • 原文地址:https://blog.csdn.net/qq_41264055/article/details/126439828