Pytorch中关于nn.Conv2d()参数的使用

 更新时间:2023年06月16日 09:16:46   作者:Akita·wang  
这篇文章主要介绍了Pytorch中关于nn.Conv2d()参数的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

关于nn.Conv2d()参数的使用

nn.Conv2d()的使用、形参与隐藏的权重参数

二维卷积应该是最常用的卷积方式了,在Pytorch的nn模块中,封装了nn.Conv2d()类作为二维卷积的实现。

使用方法和普通的类一样,先实例化再使用。

下面是一个只有一层二维卷积的神经网络,作为nn.Conv2d()方法的使用简介:

class Net(nn.Module):
    def __init__(self):
        nn.Module.__init__(self)
        self.conv2d = nn.Conv2d(in_channels=3,out_channels=64,kernel_size=4,stride=2,padding=1)
    def forward(self, x):
        print(x.requires_grad)
        x = self.conv2d(x)
        return x
print(net.conv2d.weight)
print(net.conv2d.bias)

它的形参由Pytorch手册可以查得,前三个参数是必须手动提供的,后面的有默认值。

接下来将一一介绍

卷积形参

在Pytorch的nn模块中,它是不需要你手动定义网络层的权重和偏置的,这也是体现Pytorch使用简便的地方。

当然,如果有小伙伴适应不了这种不定义权重和偏置的方法,Pytorch还提供了nn.Functional函数式编程的方法,其中的F.conv2d()就和Tensorflow一样,要先定义好卷积核的权重和偏置,作为F.conv2d()的形参之一。

回到nn.Conv2d上来,我们可以通过实例名.weight和实例名.bias来查看卷积层的权重和偏置,如上图所示。

  • in_channels

这个很好理解,就是输入的四维张量[N, C, H, W]中的C了,即输入张量的channels数。

这个形参是确定权重等可学习参数的shape所必需的。

  • out_channels

也很好理解,即期望的四维输出张量的channels数,不再多说。

  • kernel_size

卷积核的大小,一般我们会使用5x5、3x3这种左右两个数相同的卷积核,因此这种情况只需要写kernel_size = 5这样的就行了。

如果左右两个数不同,比如3x5的卷积核,那么写作kernel_size = (3, 5),注意需要写一个tuple,而不能写一个列表(list)。

  • stride = 1

卷积核在图像窗口上每次平移的间隔,即所谓的步长。这个概念和Tensorflow等其他框架没什么区别,不再多言。

  • padding = 0

Pytorch与Tensorflow在卷积层实现上最大的差别就在于padding上。

Padding即所谓的图像填充,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding = 1为例,若原始图像大小为32x32,那么padding后的图像大小就变成了34x34,而不是33x33。

Pytorch不同于Tensorflow的地方在于,Tensorflow提供的是padding的模式,比如same、valid,且不同模式对应了不同的输出图像尺寸计算公式。而Pytorch则需要手动输入padding的数量,当然,Pytorch这种实现好处就在于输出图像尺寸计算公式是唯一的,即

当然,上面的公式过于复杂难以记忆。大多数情况下的kernel_size、padding左右两数均相同,且不采用空洞卷积(dilation默认为1),因此只需要记 O = (I - K + 2P)/ S +1这种在深度学习课程里学过的公式就好了。

  • dilation = 1

这个参数决定了是否采用空洞卷积默认为1(不采用)。从中文上来讲,这个参数的意义从卷积核上的一个参数到另一个参数需要走过的距离,那当然默认是1了,毕竟不可能两个不同的参数占同一个地方吧(为0)。

  • groups = 1

决定了是否采用分组卷积,现在用的比较多的是groups = in_channel。当groups = in_channel时,是在做的depth-wise conv的,具体思想可以参考MobileNet那篇论文。

  • bias = True

即是否要添加偏置参数作为可学习参数的一个,默认为True。

  • padding_mode = ‘zeros’

即padding的模式,默认采用零填充。

对nn.Conv2d的group参数的理解

nn.Conv2d的group参数

卷积,想必冲浪在一线的大家伙们都已经耳熟能详了,自从深度学习火爆全网之后,大家都在学习一线知识,那么今天想来讲讲关于Pytorch这个深度学习框架下的nn.Conv2d的group这个参数。

group这个参数是为分组卷积而创造出来的,分组卷积的好处呢?就是减少参数量,还能够得到更多的feature map。

这篇文章具体是想探讨一下分组卷积和普通的卷积之后的结果是否相同呢?

首先先来说一下答案:当参与卷积的卷积核是一样的时候,结果是一样,否则则是不一样的。

诶诶诶,先别着急喷,这里我想表达的意思,您可能还不够理解,请接着往下看吧。

关于group这个参数,官网给的解释是这样子的。

group

大意是什么呢?大概是当groups=1的时候,假设此时 输入的通道数为n,输出的通道数为m,那么理解为把输入的通道分成1组(不分组),每一个输出通道需要在所有的输入通道上做卷积,也就是一种参数共享的局部全连接。

如果把groups改成2,可以理解为把 输入的通道分成两组,此时每一个输出通道只需要在其中一组上做卷积。

如果groups=in_channels,也就是把 输入的通道分成in_channels组(每一组也就一个通道),此时每一个输出通道只需要在其中一个输入通道上做卷积。

不太理解吧?

假如group=2的话,就是把输入通道一分为二,比如我现在的输入格式为 2 ∗ 3 ∗ 3 2*3*3 2∗3∗3的话,现在就是将输入改为 1 ∗ 3 ∗ 3 1*3*3 1∗3∗3,同样的我对应的卷积核也会变为原来通道的一半。

那分组卷积和普通卷积的结果还会不会相同呢?

看下面的代码吧。

import torch
import torch.nn as nn
from torch.autograd import Variable
x=torch.FloatTensor([[1,2,3],[4,5,6],[7,8,9],
                     [1,2,3],[4,5,6],[7,8,9]]).view(1,2,3,3)
//输入X是通道数为2的3*3矩阵。
x = Variable(x)
conv1 = nn.Conv2d(in_channels=2,
                 out_channels=2,
                 kernel_size=3,
                 stride=1,
                 padding=0,
                 groups=1,
                 bias=False) //conv1普通卷积
conv2 = nn.Conv2d(in_channels=2,
                 out_channels=2,
                 kernel_size=3,
                 stride=1,
                 padding=0,
                 groups=2,
                 bias=False) //conv2是分组卷积
print(conv1.weight.data.size())
print(conv2.weight.data.size())
conv1.weight.data = torch.FloatTensor([[[[1,2,3],[4,5,6],[7,8,9]],
                                                [[9,8,7],[6,5,4],[3,2,1]]],
                                                [[[1,2,3],[4,5,6],[7,8,9]],
                                                [[9,8,7],[6,5,4],[3,2,1]]]])
conv2.weight.data = torch.FloatTensor([[[[1,2,3],[4,5,6],[7,8,9]]],
                                               [[[9,8,7],[6,5,4],[3,2,1]]]] )
print(conv1.weight.data)
print(conv2.weight.data)
output=conv1(x)
print(output)
output=conv2(x)
print(output)

结果是:

result

可以从前两行,在conv的配置相同的情况下,选择分组卷积的话,他们的卷积核的大小就已经不一样了。

一个是torch.Size([2, 2, 3, 3])

分组卷积的则是torch.Size([2, 1, 3, 3])

可以明显的看到分组卷积的通道更少,从这里就能直观的看出,分组卷积它是沿着通道数分割成n份。

可以看到卷积核就已经发生了明显的变化,所以最终卷积的结果肯定是不同的,所以在用同一个卷积核的情况下,普通卷积的结果肯定是和分组卷积的结果是不同的。(因为分组卷积的卷积核只是普通卷积的卷积核的一部分。)

(所以一般情况是不同的,并且对应的情况一般是,这分成的n个组卷积之后的结果 的 对应点相加,才等于普通卷积卷积出的结果。)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 通过Jython调用Python脚本的实现方法

    通过Jython调用Python脚本的实现方法

    Jython 是 Python 的纯 Java 实现。她无缝地结合了 Java 类与 Python,使用户能以 Python 语言的语法编写在 Java 虚拟机上运行的 软件,本文重点给大家介绍通过Jython调用Python脚本的实现方法,一起看看吧
    2021-06-06
  • python制作定时发送信息脚本的实现思路

    python制作定时发送信息脚本的实现思路

    这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Python学习之自定义异常详解

    Python学习之自定义异常详解

    这篇文章主要为大家介绍了Python中如何自定义异常,以及自定义抛出异常的关键字—raise的用法,文中示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-03-03
  • pytorch permute维度转换方法

    pytorch permute维度转换方法

    今天小编就为大家分享一篇pytorch permute维度转换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python数字图像处理之基本图形的绘制

    python数字图像处理之基本图形的绘制

    这篇文章主要为大家介绍了python数字图像处理之基本图形的绘制,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 通过Python爬虫代理IP快速增加博客阅读量

    通过Python爬虫代理IP快速增加博客阅读量

    本文主要对通过Python爬虫代理IP快速增加博客阅读量的方法进行分析介绍。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • Pandas Matplotlib保存图形时坐标轴标签太长导致显示不全问题的解决

    Pandas Matplotlib保存图形时坐标轴标签太长导致显示不全问题的解决

    在使用matplotlib作图的时候,有的时候会遇到画图时显示不全和图片保存时不完整的问题,这篇文章主要给大家介绍了关于Pandas Matplotlib保存图形时坐标轴标签太长导致显示不全问题的解决方法,需要的朋友可以参考下
    2022-06-06
  • Numpy中关于arctan和arctan2的区别

    Numpy中关于arctan和arctan2的区别

    这篇文章主要介绍了Numpy中关于arctan和arctan2的区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python用栈实现队列的基本操作

    Python用栈实现队列的基本操作

    队列(Queue)和栈(Stack)是常见的数据结构,它们在计算机科学中有着广泛的应用,在Python中,可以使用列表(List)来实现栈,但要用栈来实现队列需要一些巧妙的操作,本文就给大家详细介绍一下Python中如何用栈实现队列,需要的朋友可以参考下
    2023-11-11
  • Python基础面向对象之继承与派生详解

    Python基础面向对象之继承与派生详解

    这篇文章主要为大家介绍了Python基础面向对象之继承与派生详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论