Pytorch的nn.Conv2d()详解

Pytorch的nn.Conv2d()详解nn.Conv2d()的使用、形参与隐藏的权重参数in_channelsout_channelskernel_sizestride=1padding=0dilation=1groups=1bias=Truepadding_mode=’zeros’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手册可以查得,前三个参数是必须手动提供的,后面的有默认值。接下来将一一介绍:
卷积形参
  也许有细心的同学已经发现了,emm…卷积层最重要的可学习参数——权重参数和偏置参数去哪了?在Tensorflow中都是先定义好weight和bias,再去定义卷积层的呀!别担心,在Pytorch的nn模块中,它是不需要你手动定义网络层的权重和偏置的,这也是体现Pytorch使用简便的地方。当然,如果有小伙伴适应不了这种不定义权重和偏置的方法,Pytorch还提供了nn.Functional函数式编程的方法其中的F.conv2d()就和Tensorflow一样要先定义好卷积核的权重和偏置,作为F.conv2d()的形参之一。
  回到nn.Conv2d上来,我们可以通过实例名.weight和实例名.bias来查看卷积层的权重和偏置,如上图所示。还有小伙伴要问了,那么它们是如何初始化的呢?
  首先给结论,在nn模块中,Pytorch对于卷积层的权重和偏置(如果需要偏置)初始化都是采用He初始化的,因为它非常适合于ReLU函数。这一点大家看Pytorch的nn模块中卷积层的源码实现就能清楚地发现了,当然,我们也可以重新对权重等参数进行其他的初始化,可以查看其他教程,此处不再多言。

in_channels

  这个很好理解,就是输入的四维张量[N, C, H, W]中的C了,即输入张量的channels数。这个形参是确定权重等可学习参数的shape所必需的。

out_channels

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

kernel_size

  卷积核的大小,一般我们会使用5×5、3×3这种左右两个数相同的卷积核,因此这种情况只需要写kernel_size = 5这样的就行了。如果左右两个数不同,比如3×5的卷积核,那么写作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)。
  更形象和直观的图示可以观察Github上的Dilated convolution animations,展示了dilation=2的情况

groups = 1

  决定了是否采用分组卷积,groups参数可以参考groups参数详解

bias = True

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

padding_mode = ‘zeros’

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126202.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 虹软人脸识别的闸机开发经验及源码分享[通俗易懂]

    虹软人脸识别的闸机开发经验及源码分享[通俗易懂]虹软人脸识别的闸机开发经验及源码分享

    2022年4月21日
    49
  • Postgresql动态SQL

    Postgresql动态SQLPostgreSQL支持动态SQL,以PL/Pgsql为例,语法如下:EXECUTEcommand-string[INTO[STRICT]target][USINGexpression[,…]];上式中的可选项target表示arecordvariable,arowvariable,oracomma-separatedlistofsimplev…

    2022年6月23日
    48
  • java-xml文件

    java-xml文件使用DOM思想,读取xml文件介绍dom4j核心类1。SAXReaderDOM解析思想的核心类方法:read(绑定了这个xml文件的输入流)读取xml文件返回文档对象,返回值是Doucment对象2.Doucment对象方法:getRootElement()获取文档的根标签返回值:返回的是标签对象Element3.Element标签对象方法获取子标签Listelements()返回所有子标签集合List方法:StringattributeValues(String属性

    2022年7月8日
    20
  • lede旁路由设置方法

    lede旁路由设置方法lede固件号:2.361.把网络–>接口里面wan口删除2.推荐新建lan口,把原来的lan停用3.新lan口配置:静态地址ipv4地址:主路由地址ipv4子网掩码:255.255.255.0ipv4网关:主路由地址使用自定义的DNS服务器:主路由地址关闭DHCP如果出现访问国内网站巨慢,慢到离谱那种请在旁路由执行以下代码iptables-tnat-IPOSTROUTING-jMASQUERADE并在网络—>防火墙中勾选丢弃无用数据包…

    2022年6月11日
    41
  • c# dynamic用法_dynamic_cast详解

    c# dynamic用法_dynamic_cast详解dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你

    2022年8月4日
    6
  • Hsql 查询_sql数据查询

    Hsql 查询_sql数据查询还是班级,学省

    2022年9月22日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号