nn.Conv2d()详解,便于查找-灵析社区

清晨我上码

nn.Conv2d()函数,便于自己查找

1. nn.Conv2d()的使用

二维卷积作为图像视觉中最常用的卷积方式,在Pytorch的nn模块中,封装了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)


2. nn.Conv2d()的参数

它的前三个参数是必须手动提供的,后面的有默认值。


  • 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

  卷积核在图像窗口上每次平移的间隔,也就是所谓的步长。

  • padding = 0

  图像填充大小,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding = 1为例,若原始图像大小为16x16,那么padding后的图像大小就变成了18x18,而不是17x17。

 大多数情况下的kernel_size、padding左右两数均相同,且不采用空洞卷积(dilation默认为1),因此只需要记 O = (I - K + 2P)/ S +1 即可,其中I为输入图像尺寸,O为输出图像尺寸(这里假定图像宽和高相等),K为卷积核大小,P为填充大小,S为步长。

  • dilation = 1

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

  更形象和直观的图示可以观察Github上的Dilated convolution animations,展示了dilation=2的情况。

  • groups = 1

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

  • bias = True

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

  • padding_mode = ‘zeros’

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


阅读量:94

点赞量:0

收藏量:0