【pytorch】2.7 卷积函数 nn.conv2d

torch.nn.Conv2d(in_channel, 
                out_channel, 
                kernel_size, 
                stride=1, 
                padding=0, 
                dilation=1, 
                groups=1, 
                bias=True, 
                padding_module='zeros')
  • 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,图像填充的行数、列数。需要注意的是这里的填充包括图像的上下左右,以padding = 1为例,若原始图像大小为32x32,那么padding后的图像大小就变成了34x34,而不是33x33。

padding 参数赋值个数不同时:

  • 4个值:上 右 下 左;(为顺时针方向),比如 padding=(2, 4, 2, 4)
  • 3个值:上 左=右 下;
  • 2个值:上=下 左=右;
  • 1个值:上=右=下=左;

如果在左右两边补零总数是偶数,那么左右补零数量相等
如果在左右补零的总数是奇数,那么右侧补零比左侧多一个
同理,当上下总共补零为奇数的时候,下侧补零数量比上侧多一个

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

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

【pytorch】2.7 卷积函数 nn.conv2d_第1张图片

  • dilation:这个参数决定了是否采用空洞卷积,啥是空洞卷积,放两张图你就懂了。默认为1(不采用)。
    【pytorch】2.7 卷积函数 nn.conv2d_第2张图片

【pytorch】2.7 卷积函数 nn.conv2d_第3张图片

  • groups:控制输入和输出之间的连接,默认为1。group=1,输出是所有的输入的卷积;group=2,此时相当于有并排的两个卷积层,每个卷积层计算输入通道的一半,并且产生的输出是输出通道的一半,随后将这两个输出连接起来。
# 当 group=1 时
conv = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=1, groups=1)
conv.weight.data.size()   # torch.size([12, 6, 1, 1])


# 当 group=2 时
conv = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=1, groups=2)
conv.weight.data.size()   # torch.size([12, 3, 1, 1])


# 当 group=3 时
conv = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=1, groups=3)
conv.weight.data.size()   # torch.size([12, 2, 1, 1])

  • bias:是否要添加偏置参数作为可学习参数,默认为True。

  • padding_mode:padding的模式,默认为 ‘zeros’

你可能感兴趣的:(#,pytorch,pytorch,深度学习,cnn)