• pytorch初学笔记(八):神经网络之卷积操作


     目录

    一、卷积操作

     二、二维卷积操作

    2.1 torch.nn.functional

     2.2 conv2d方法介绍

    2.2.1 使用该方法需要引入的参数

    2.2.2 常用参数

    2.2.3 关于对input和weight的shape详解

     三、代码实战

    3.1 练习要求 

    3.2 tensor的reshape操作 

    3.3 不同stride的对比  

    3.4 不同padding的对比

    3.5 完整代码


    一、卷积操作

    torch.nn — PyTorch 1.13 documentation

     

     

     二、二维卷积操作

    2.1 torch.nn.functional

     代码中引入torch.nn.functional,起别名为F

    import torch.nn.functional as F

     

     2.2 conv2d方法介绍

    什么是二维卷积?

    二维卷积nn.Conv2d用于图像数据,对宽度和高度都进行卷积 

     

    2.2.1 使用该方法需要引入的参数

    torch.nn.functional.conv2d(inputweightbias=Nonestride=1padding=0

    dilation=1groups=1) → Tensor

     

     

    2.2.2 常用参数

    • input:输入矩阵,为tensor型,
    • weight:卷积核 ,为tensor型
    • stride:步长,默认为1
    • padding:填充大小,默认为0

     


    2.2.3 关于对input和weight的shape详解

    方法中对input和weight要求的shape都需要是4维的。

    1.  input的shape要求:      

    • minibatch:batch中的样例个数
    • in_channels:每个样例数据的通道数
    • iH:每个样例的高(行数)
    • iW:每个样例的宽(列数)

    2.  weight的shape要求:

    • out_channels:卷积核的个数
    • in_channels/groups:每个卷积核的通道数
    • kH:每个卷积核的高(行数)
    • kW:每个卷积核的宽(列数)

    (29条消息) 如何理解卷积神经网络中的通道(channel)_Medlen的博客-CSDN博客_卷积神经网络通道数

    正常定义的tensor型shape均为二维,即只有长和宽,

    因此需要使用reshape方法进行尺寸重定义。

     

     三、代码实战

    3.1 练习要求 

    代码将完成以下操作:

    1. 输入如下图所示的5*5矩阵
    2. 卷积核为下图所示的3*3矩阵
    3. 设置步长stride为1,使用conv2d方法进行卷积操作
    4. 输出结果 

    3.2 tensor的reshape操作 

     输入的input大小为5*5,输入的kernel大小为3*3,均不符合conv2d方法中要求的shape大小,因此使用reshape方法进行tensor的尺寸重定义操作。

    torch.reshape方法输入的第一个参数为需要改变大小的tensor,第二个参数为需要改变的大小,使用括号括起来的4个数字,前两个数字均为1,后两个数字为tensor的长和宽。

    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. print(input.shape)
    14. print(kernel.shape)
    15. # 重新定义尺寸,把尺寸改成四个数,1个batchsize,1个通道,长和宽和之前一样
    16. input = torch.reshape(input,(1,1,5,5))
    17. kernel = torch.reshape(kernel,(1,1,3,3))
    18. print(input.shape)
    19. print(kernel.shape)

    输出: 

     可见两个tensor的大小都已经成功被改变,可以输入conv2d中进行下一步操作。 

    1. output = F.conv2d(input,kernel)
    2. print(output)

    输出: 

     可见已成功进行卷积操作。

    3.3 不同stride的对比  

     步长(stride):

    卷积核是在图片上移动后遍历每一个像素,每次移动的大小就是步长stride

    1. #stride=1或2时的输出
    2. output1 = F.conv2d(input,kernel,stride=1)
    3. print(output1)
    4. output2 = F.conv2d(input,kernel,stride=2)
    5. print(output2)

    输出:

     

    可以看到stride=1时输出的tensor大小为3*3,stride=2时为2*2。

     

    3.4 不同padding的对比

    padding(填充):

     习惯上,我们可以使用0来对图像进行填充。规定p( padding )代表填充的层数。

    是为了满足输出的图像的维度要求,最终图像的输出宽度会=原来输出宽度+2padding,因为是周围填充

    1. # padding=1或2时的
    2. output3 = F.conv2d(input,kernel,stride=1,padding=1)
    3. print(output3)
    4. output4 = F.conv2d(input,kernel,stride=1,padding=2)
    5. print(output4)

    输出:

    可以看到不同的padding输出的tensor大小不同。 

    3.5 完整代码

    1. import torch
    2. #引入F
    3. import torch.nn.functional as F
    4. # 输入
    5. input = torch.tensor([[1,2,0,3,1],
    6. [0,1,2,3,1],
    7. [1,2,1,0,0],
    8. [5,2,3,1,1],
    9. [2,1,0,1,1]])
    10. # 卷积核
    11. kernel = torch.tensor([[1,2,1],
    12. [0,1,0],
    13. [2,1,0]])
    14. print(input.shape)
    15. print(kernel.shape)
    16. # 重新定义尺寸,把尺寸改成四个数,1个batchsize,1个通道,长和宽和之前一样
    17. input = torch.reshape(input,(1,1,5,5))
    18. kernel = torch.reshape(kernel,(1,1,3,3))
    19. print(input.shape)
    20. print(kernel.shape)
    21. #stride=1或2时的输出
    22. output1 = F.conv2d(input,kernel,stride=1)
    23. print(output1)
    24. output2 = F.conv2d(input,kernel,stride=2)
    25. print(output2)
    26. # padding=1或2时的
    27. output3 = F.conv2d(input,kernel,stride=1,padding=1)
    28. print(output3)
    29. output4 = F.conv2d(input,kernel,stride=1,padding=2)
    30. print(output4)

  • 相关阅读:
    4.2 实现基于栈的表达式求值计算器(难度4/10)
    write_project_tcl
    网页脚本语言第一节课9.19
    指针笔试题讲解(让指针变得简单易懂)
    思辨:移动开发的未来在哪?
    交易用户如何去使用l2行情数据api接口?
    vi-vim常用命令
    python代码修改
    数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)
    直播预告 | YashanDB 2023年度发布会正式定档11月2日,邀您共同见证国产数据库发展实践!
  • 原文地址:https://blog.csdn.net/weixin_45662399/article/details/127949867