PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略

PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略一 Caffe Tensorflow 的 padding 策略在之前的转载过的一篇文章 tensorflowck 文件转 caffemodel 时遇到的坑 提到过 caffe 的 padding 方式和 tensorflow 的 padding 方式有很大的区别 输出无法对齐 这是为什么呢 下面简单回顾一下 卷积操作输出的形状计算公式是这样的 output shape image shap

一. Caffe、Tensorflow的padding策略

在之前的转载过的一篇文章——《tensorflow ckpt文件转caffemodel时遇到的坑》提到过,caffe的padding方式和tensorflow的padding方式有很大的区别,输出无法对齐。这是为什么呢?

下面简单回顾一下

卷积操作输出的形状计算公式是这样的:

output_shape = (image_shape-filter_shape+2*padding)/stride + 1

因为padding前面的系数是2,所以在padding时,一般是对称地补,左/右各padding一列 或者 上下各padding一行。

那么问题来了,如果stride是2,而括号里算出来的值刚好是奇数怎么办?那就再偷偷摸摸补一列padding或者补一行padding。

于是,caffe和tensorflow的区别就出来了。

caffe偷偷摸摸地把一行0补在上面 或者 把一列0补在左边,tensorflow正好镜像对称,把一行0补在下面或者把一列0补在右边。这就是导致输出对齐不了的原因,前面几层输出的feature map的中间还能勉强对上,随着网络结构的加深,到fc之前已经完全对不上了。

也就是说

  • caffe的padding策略是把0补在左上
  • tensorflow的padding策略是把0补在右下

那么,PyTorch的padding策略是怎样的呢?在介绍padding策略之前,先简单的介绍一下PyTorch中的nn.Conv2d算子。

二. nn.Conv2d简单说明

nn.Conv2d的介绍主要译自官网

nn.Conv2d的功能是:对由多个输入平面组成的输入信号进行二维卷积,以最简单的例子进行说明:

输入信号的形式为 ( N , C i n , H , W ) (N,C_{in},H,W) (N,Cin,H,W) N N N表示batch size, C i n C_{in} Cin表示channel个数, H H H W W W分别表示特征图的高和宽。

参数说明:

  • stride(步长):控制cross-correlation的步长,可以设为1个int型数或者一个(int, int)型的tuple。
  • padding(补0):控制zero-padding的数目。
  • dilation(扩张):控制kernel点(卷积核点)的间距; 也被称为 “à trous”算法. 可以在此github地址查看:Dilated convolution animations
  • groups(卷积核个数):这个比较好理解,通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —— in_channels中数目的卷积核:

At groups=1, all inputs are convolved to all outputs.
At groups=2, the operation becomes equivalent to having two conv layers side by side, each seeing half the input channels, and producing half the output channels, and both subsequently concatenated.
At groups=in_channels, each input channel is convolved with its own set of filters (of size ⌊out_channelsin_channels⌋
).






还有一点需要提醒的是:卷积核的size的选择可能导致input中某几行(最后几行)没有关联起来,这是因为我们默认使用的模式是valid,而不是full(在tensorflow中也称为same)。如果想要充分利用input的话,则依赖于用户对padding以及stride等参数的设置。相比tensorflow,PyTorch需要用户清楚的知道的自己的卷积核选取对结果的影响。

参数的详细说明(基于PyTorch0.4.1)

这里写图片描述

下图中的 H o u t H_{out} Hout W o u t W_{out} Wout是根据我们在nn.Conv2d中设置的padding,dilation,kernel_size,stride等参数得到的输出特征图的高度和宽度。
这里写图片描述

三. nn.Conv2d中的padding操作

nn.Conv2d简单介绍完了,现在来讲讲padding在nn.Conv2d中怎么实现的,也就是怎么补的0,或者说补0的策略。

Q1: padding是卷积之后还是卷积之前还是卷积之后实现的?

padding是在卷积之前补0,如果愿意的话,可以通过使用torch.nn.Functional.pad来补非0的内容。

Q2:padding补0的默认策略是什么?

这里写图片描述
显然,padding=1的效果是:原来的输入层基础上,上下左右各补了一行!除此之外我们看到,上下左右都是0.9862,那么,这个东西是啥呢?为什么不是0呢?

Hello, I just can’t figure out the way nn.Conv2d calculate the output . The result calculated from torch is not the same as some machine learning course had taught. For example, likes the code below: >> m = torch.nn.Conv2d(1, 1, 3, padding=0) >> m(input) tensor([[[[ 0.5142, 0.3803, 0.2687], [-0.4321, 1.1637, 1.0675], [ 0.1742, 0.0869, -0.4451]]]], grad_fn= 
  
    ) >> input tensor([[[[ 0.7504, 0.1157, 1.4940, -0.2619, -0.4732], [ 0.1497, 0.0805, 2.0829, -0.0925, -1.3367], [ 1.7471, 0.5205, -0.8532, -0.7358, -1.3931], [ 0.1159, -0.2376, 1.2683, -0.0959, -1.3171], [-0.1620, -1.8539, 0.0893, -0.0568, -0.0758]]]]) >> m.weight Parameter containing: tensor([[[[ 0.2405, 0.3018, 0.0011], [-0.1691, -0.0701, -0.0334], [-0.0429, 0.2668, -0.2152]]]], requires_grad=True) for the left top element 0.5142, it’s not the output equals to >> import numpy as np >> w = np.array([[0.2405, 0.3018, 0.0011], >> [-0.1691, -0.0701, -0.0334], >> [-0.0429, 0.2668, -0.2152]]) # top-left 3x3 matrix of 5x5 >> x = np.array([[ 0.7504, 0.1157, 1.4940], >> [ 0.1497, 0.0805, 2.0829], >> [1.7471, 0.5205, -0.8532]]) >> print(np.sum(w*x)) # 0. != 0.5142 0. My Question here is: Why Could the output not equal to 0.5142? Further more, when i add paramter padding into nn.Conv2d, The outcome seems obscure to me as below, thanks a lot for explain that to me.Thank you! >> input tensor([[[[ 0.7504, 0.1157, 1.4940, -0.2619, -0.4732], [ 0.1497, 0.0805, 2.0829, -0.0925, -1.3367], [ 1.7471, 0.5205, -0.8532, -0.7358, -1.3931], [ 0.1159, -0.2376, 1.2683, -0.0959, -1.3171], [-0.1620, -1.8539, 0.0893, -0.0568, -0.0758]]]]) # set padding from 0 to 1 equals to (1, 1) >> m1 = torch.nn.Conv2d(1, 1, 1, padding=1) >> m1(input) tensor([[[[0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862], [0.9862, 1.0771, 1.0002, 1.1672, 0.9544, 0.9288, 0.9862], [0.9862, 1.0043, 0.9959, 1.2385, 0.9749, 0.8242, 0.9862], [0.9862, 1.1978, 1.0492, 0.8828, 0.8970, 0.8174, 0.9862], [0.9862, 1.0002, 0.9574, 1.1398, 0.9745, 0.8266, 0.9862], [0.9862, 0.9665, 0.7615, 0.9970, 0.9793, 0.9770, 0.9862], [0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862, 0.9862]]]], grad_fn= 
   
     ) The confused point is that how 0.9862 be calculated? And what is the default padding strategy in nn.Conv2d? Thank you for reading and answer! 
    
  

根据下图,Q2中神秘的0.9862的来历我们就很清楚了,是bias的值。
这里写图片描述

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

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

(0)
上一篇 2026年3月19日 上午9:00
下一篇 2026年3月19日 上午9:00


相关推荐

  • 吴泳铭挂帅Token争夺战,阿里“悟空”出击OpenClaw

    吴泳铭挂帅Token争夺战,阿里“悟空”出击OpenClaw

    2026年3月19日
    2
  • SAP Enhancement

    SAP Enhancement(一)什么是增强(Enhancement)?简单地说,增强就是ERP系统中标准程序的出口,在该出口中由用户根据企业实际需求编写客户化逻辑代码。增强是ERP系统设计时考虑到企业实际的流程有可能和系统默认标准流程不同,在标准流程框架下专门留的接口,每个接口对应一个客户化函数,这些出口函数有标准处理程序传入的参数和输出参数,用户可根据系统输入参数做条件编写适合本企业流程的逻辑,然后通过输

    2025年5月24日
    4
  • 【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型

    【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型

    2026年3月12日
    3
  • VBA获取股票历史数据方法

    VBA获取股票历史数据方法Sub股票历史记录查询()Worksheets(“历史记录表”).Cells.Clear”输出结果表X=Application.CountA(Worksheets(“代码”).Range(“A:A”))”需要提取的股票代码Y=1Fori=2ToXdm=IIf(Worksheets(“代码”).Cells(i,1)<600000,…

    2022年6月24日
    49
  • Linux——常用命令(压缩和解压缩)

    Linux——常用命令(压缩和解压缩)在Linux中可以识别的常见压缩格式有几十种,比如.zip、.gz、.bz2、.tar、.tar.gz、.tar.bz2等。1、zip格式

    2022年6月7日
    30
  • nginx正向代理概念

    nginx正向代理概念1 正向代理概念正向代理 也就是我们常说的代理 其工作原理为 我访问不了某个网站 但是我能访问一个代理服务器 这个代理服务器他能访问那个我不能访问的网站 于是我连上代理服务器 告诉他我需要那个无法访问网站的内容 代理服务器去取回来之后返回给我 从网站的角度来说只在代理服务器来取内容的时候有一次记录 有时候并不知道是用户的请求 也隐藏了用户的资料 这取决于代理是否告诉网站 总之 正向代理是一个

    2026年3月26日
    3

发表回复

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

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