• 七、torch.nn


    一、神经网络模块

    进入到PyTorch的torch.nnAPI学习页面
    PyTorch提供了很多的神经网络方面的模块,NN就是Neural Networks的简称
    在这里插入图片描述

    二、Containers

    torch.nn下的Containers
    一共有六个模块,最常用的就是Module模块,看解释可以知道,Module是为所有的神经网络所提供的基础类
    在这里插入图片描述

    Moduel

    torch.nn.Containers下的Moduel
    自己所搭建的神经网络必须继承这个Moduel类,其也相当于一个模板
    在这里插入图片描述
    模仿一下,创建一个神经网络模型,y = 5 + x
    神经网络中的参数都是tensor类型,这点需要注意

    import torch
    from torch import nn
    
    
    class Beyond(nn.Module):
        def __init__(self):
            super().__init__()
    
        def forward(self,input):
            output = input + 5
            return output
    
    beyond = Beyond()
    x = torch.tensor(5.0)
    out = beyond(x)
    print(out)#tensor(10.)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三、Convolution Layers

    torch.nn下的Convolution Layers卷积层
    常用的就是nn.Conv2d二维卷积,卷积核是二维
    在这里插入图片描述

    四、torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

    TORCH.NN.FUNCTIONAL.CONV2D方法使用说明
    在这里插入图片描述

    参数描述解释
    input形状的输入张量
    weight权重也就是卷积核
    bias偏置
    stride卷积核的步幅。可以是单个数字或元组(sH, sW)。默认值:1可以指定两个方向的步长,也可以输入一个参数同时设置两个方向
    padding输入两侧的隐式填充也就是加边

    卷积操作这里就不再赘述了,与kernel对应相乘再相加运算而已

    import torch
    import torch.nn.functional
    
    input = torch.tensor([[1,2,3,4,5],
                          [5,4,3,2,1],
                          [1,2,3,4,5],
                          [5,4,3,2,1],
                          [1,2,3,4,5]])
    
    kernel = torch.tensor([[1,2,3],
                           [3,2,1],
                           [1,2,3]])
    print(input.shape)#torch.Size([5, 5])
    print(kernel.shape)#torch.Size([3, 3])
    #目前input和weight仅为(H,W),不符合conv2d的输入要求
    
    #由官网看到的input为四维(minibatch,in_channels,iH,iW)数据,故通过reshape进行转变
    #weight也就是kernel是要求四维数据信息
    input_re = torch.reshape(input,(1,1,5,5))
    kernel_re = torch.reshape(kernel,(1,1,3,3,))
    print(input_re.shape)#torch.Size([1, 1, 5, 5])
    print(kernel_re.shape)#torch.Size([1, 1, 3, 3])
    
    out_1 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1)
    print(out_1)
    """
    tensor([[[[54, 60, 66],
              [54, 48, 42],
              [54, 60, 66]]]])
    """
    
    out_2 = torch.nn.functional.conv2d(input_re,kernel_re,stride=2)
    print(out_2)
    """
    tensor([[[[54, 66],
              [54, 66]]]])
    """
    
    out_3 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1,padding=1)
    print(out_3)
    """
    tensor([[[[26, 32, 32, 32, 26],
              [30, 54, 60, 66, 36],
              [48, 54, 48, 42, 30],
              [30, 54, 60, 66, 36],
              [26, 32, 32, 32, 26]]]])
    """
    
    • 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

    五、torch.nn.ReLU(inplace=False)

    ⅠReLU函数介绍

    torch.nn.ReLU(inplace=False)官网提供的API
    其中inplace表示是否在对原始数据进行替换

    由函数图可以看出,负数通过ReLU之后会变成0,正数则不发生变化
    在这里插入图片描述
    例如:input = -1,若inplace = True,表示对原始输入数据进行替换,当通过ReLU函数(负数输出均为0)之后,input = 0
    若inplace = False(默认),表示不对原始输入数据进行替换,则需要通过另一个变量(例如output)来对ReLU函数的结果进行接收存储,通过ReLU函数之后,output = 0,input = -1

    ⅡReLU函数使用

    创建一个二维tensor数据,通过reshape转换成(batch_size,channel,H,W)类型数据格式
    传入仅含有ReLU的神经网络中,运行结果可以看出,负数都变成了0,正数均保持不变

    import torch
    from torch import nn
    
    input = torch.tensor([[1,-0.7],
                          [-0.8,2]])
    
    input = torch.reshape(input,(-1,1,2,2))
    
    print(input)
    """
    tensor([[[[ 1.0000, -0.7000],
              [-0.8000,  2.0000]]]])
    """
    
    
    class Beyond(nn.Module):
        def __init__(self):
            super(Beyond,self).__init__()
            self.relu_1 = torch.nn.ReLU()
    
        def forward(self,input):
            output = self.relu_1(input)
            return  output
    
    beyond = Beyond()
    output = beyond(input)
    print(output)
    """
    tensor([[[[1., 0.],
              [0., 2.]]]])
    """
    
    • 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

    ⅢReLU训练CIFAR-10数据集上传至tensorboard

    import torch
    import torchvision
    from torch import nn
    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)
    
    dataloader = DataLoader(dataset_test,batch_size=64)
    
    class Beyond(nn.Module):
        def __init__(self):
            super(Beyond,self).__init__()
            self.relu_1 = torch.nn.ReLU()
    
        def forward(self,input):
            output = self.relu_1(input)
            return output
    
    writer = SummaryWriter("y_log")
    
    beyond = Beyond()
    i=0
    for data in dataloader:
        imgs,targets = data
        writer.add_images("input_ReLU",imgs,i)
        output = beyond(imgs)
        writer.add_images("output_ReLU",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

    在Terminal下运行tensorboard --logdir=y_log --port=9999,logdir为打开事件文件的路径,port为指定端口打开;
    通过指定端口9999进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
    在这里插入图片描述
    点击该链接或者复制链接到浏览器打开即可
    在这里插入图片描述

    六、torch.nn.Sigmoid

    ⅠSigmoid函数介绍

    torch.nn.Sigmoid
    在这里插入图片描述

    ⅡSigmoid函数使用

    创建一个二维tensor数据,通过reshape转换成(batch_size,channel,H,W)类型数据格式
    传入仅含有Sigmoid的神经网络中,代入Sigmodi公式即可得到相应返回结果

    import torch
    from torch import nn
    
    input = torch.tensor([[1,-0.7],
                          [-0.8,2]])
    
    input = torch.reshape(input,(-1,1,2,2))
    
    print(input)
    """
    tensor([[[[ 1.0000, -0.7000],
              [-0.8000,  2.0000]]]])
    """
    
    
    class Beyond(nn.Module):
        def __init__(self):
            super(Beyond,self).__init__()
            self.sigmoid_1 = torch.nn.Sigmoid()
    
        def forward(self,input):
            output = self.sigmoid_1(input)
            return  output
    
    beyond = Beyond()
    output = beyond(input)
    print(output)
    """
    tensor([[[[0.7311, 0.3318],
              [0.3100, 0.8808]]]])
    """
    
    • 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

    ⅢSigmoid训练CIFAR-10数据集上传至tensorboard

    import torch
    import torchvision
    from torch import nn
    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)
    
    dataloader = DataLoader(dataset_test,batch_size=64)
    
    class Beyond(nn.Module):
        def __init__(self):
            super(Beyond,self).__init__()
            self.sigmoid_1 = torch.nn.Sigmoid()
    
        def forward(self,input):
            output = self.sigmoid_1(input)
            return  output
    
    writer = SummaryWriter("y_log")
    
    beyond = Beyond()
    i=0
    for data in dataloader:
        imgs,targets = data
        writer.add_images("input_Sigmoid",imgs,i)
        output = beyond(imgs)
        writer.add_images("output_Sigmoid",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

    在Terminal下运行tensorboard --logdir=y_log --port=9999,logdir为打开事件文件的路径,port为指定端口打开;
    通过指定端口9999进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
    在这里插入图片描述

  • 相关阅读:
    同比增长近70%!三大分化趋势,谁在抢食600万辆L2市场
    Spring boot 整合grpc 运用
    Java本地远程断点调试(实战记录)
    K8s复习笔记4-探针
    腾讯、飞书等在线表格自动化编辑--python
    SSM毕设项目车辆维修管理系统m97p7(java+VUE+Mybatis+Maven+Mysql)
    油溶性CdSeTe/ZnS量子点,发光波长640nm-820nm
    web3去中心化身份可验证凭证
    常用封装工具类
    Java NIO 三大核心(Buffer、Channel、Selector)理解
  • 原文地址:https://blog.csdn.net/qq_41264055/article/details/126436793