Tensorflow 和 Pytorch 中 Conv2d Padding的区别

Pytorch中Conv2d的Padding

可以是整数,二元组,字符串三种形式。

  1. 整数(int)。如果输入的padding为整数则代表在 上,下,左,右 四个方向都充填一样数量的0或者由padding_mode 确定的padding类型。
  2. 二元组(tuple)。如果输入的padding 为二元组(padding[0],padding[1]),则padding[0]代表上下两个方向的padding大小,padding[1]则代表左右两个方向的padding大小。
  3. 字符串(str)。字符串模式可选参数为 validsamevalid模式表示不充填,same模式表示输入与输出的形状大小保持一致(但是仅仅适用于stride=1的情况!!!)

可以看出pytorch都是对称的进行padding,要么是四个方向都是一样的padding,要么上下或左右做一样的padding。

最后的输出形状计算公式如下:
Hout=⌊Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1stride[0]+1⌋H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor Hout​=⌊stride[0]Hin​+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1​+1⌋

Wout=⌊Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1stride[1]+1⌋W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor Wout​=⌊stride[1]Win​+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1​+1⌋

Tensorflow 中 Conv2d的padding

可以是 字符串和列表两种形式:

  1. 字符串。 字符串是可选 SAMEVALIDSAME模式下,根据以下公式计算各方向的padding:

PadH=max(filterH−(InH%strideH),0)Pad_{H} = max(filter_H - (In_H \space \% \space stride_H),0) PadH​=max(filterH​−(InH​ % strideH​),0)

PadW=max(filterW−(InW%strideW),0)Pad_{W} = max(filter_W - (In_W \space \% \space stride_W),0) PadW​=max(filterW​−(InW​ % strideW​),0)

Padtop=⌊PadH2⌋Pad_{top} =\left\lfloor \frac{Pad_{H}}{2} \right\rfloor Padtop​=⌊2PadH​​⌋

Padbottom=PadH−PadtopPad_{bottom} = Pad_{H} - Pad_{top} Padbottom​=PadH​−Padtop​

Padleft=⌊PadW2⌋Pad_{left} = \left\lfloor \frac{Pad_{W}}{2} \right\rfloor Padleft​=⌊2PadW​​⌋

Padright=PadW−PadleftPad_{right} = Pad_{W} - Pad_{left} Padright​=PadW​−Padleft​

不同于pytorch,tensorflow的SAME模式适用于任何的Stride时的padding,输出的形状为:
OutH=InHstrideOut_{H} = \frac{In_{H}}{stride} OutH​=strideInH​​

OutW=InWstrideOut_{W} = \frac{In_{W}}{stride} OutW​=strideInW​​

可以看出,tensorflow的padding不要求是对称的,上下左右的padding大小都可以不一样,而且优先进行右边和下边的padding(因为SAME模式设计的初衷就是为了应对输出形状无法整除卷积核大小,而导致的最右边或最下边无法卷积的情况),当你不关心padding的方向和大小,只关心输出的形状是不是原来形状的整数倍时,就可以无脑使用SAMEpadding 模式,tensorflow会自动帮你计算好要padding的大小。

VALID模式下,与pytorch一样,直接不padding 。当输入形状不能整除卷积核大小,滑动窗口滑到最右边发现无法满足卷积条件时,多出来的那部分直接会被舍弃掉,输出的形状为:
OutH=InH−filterH+1strideHOut_{H} = \frac{In_H - filter_H + 1}{stride_{H}} OutH​=strideH​InH​−filterH​+1​

OutW=InW−filterW+1strideWOut_{W} = \frac{In_W - filter_W + 1}{stride_{W}} OutW​=strideW​InW​−filterW​+1​

  1. 列表(list)。Tensor格式为默认的**“NHWC”** 时, padding list的格式为 [[0,0],[pad_top,pad_bottom],[pad_left,pad_right],[0,0]];采用的**“NCHW”**格式存储的Tensor时,padding list 的格式为 [[0,0],[0,0],[pad_top,pad_bottom],[pad_left,pad_right]]。输出的形状为:

OutH=InH+padtop+padbottom−dilationH×(filterH−1)−1strideHOut_{H} = \frac{In_{H} + \text{pad}_{top}+\text{pad}_{bottom} - \text{dilation}_{H} \times (\text{filter}_{H}- 1) - 1}{\text{stride}_{H}} OutH​=strideH​InH​+padtop​+padbottom​−dilationH​×(filterH​−1)−1​

OutW=InW+padright+padleft−dilationW×(filterW−1)−1strideWOut_{W} = \frac{In_{W} + \text{pad}_{right}+\text{pad}_{left} - \text{dilation}_{W} \times (\text{filter}_{W}- 1) - 1}{\text{stride}_{W}} OutW​=strideW​InW​+padright​+padleft​−dilationW​×(filterW​−1)−1​

注意: Tensorflow 和 Pytorch 中Conv2D 对输出的形状大小的小数部分处理不一样。Pytorch中都是做截断处理,或者说向下取整,例如 输出若为 117.5 则直接取 117;而Tensorflow中对小数的处理采用的则是向上取整,输出若为117.5,则取128

参考

https://www.tensorflow.org/api_docs/python/tf/nn#notes_on_padding_2

https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别相关推荐

  1. PyTorch中的padding操作

    1. 介绍 我们知道,在对图像执行卷积操作时,如果不对图像边缘进行填充,卷积核将无法到达图像边缘的像素,而且卷积前后图像的尺寸也会发生变化,这会造成许多麻烦. 因此现在各大深度学习框架的卷积层实现上基 ...

  2. pytorch中load和load_state_dict区别

    torch.load 加载的是训练好的模型 例如 torch.load("ad.pth") 而load_state_dict是net的一个方法 是将torch.load加载出来的数 ...

  3. Pytorch中 .numpy() .item() .cpu() 区别

    .numpy() 与 .item() 这两个可以归为一类,是将Tensor变量转换为非Tensor变量. t.numpy()将Tensor变量转换为ndarray变量,其中t是一个Tensor变量,可 ...

  4. PyTorch中的nn.Conv1d与nn.Conv2d

    本文主要介绍PyTorch中的nn.Conv1d和nn.Conv2d方法,并给出相应代码示例,加深理解. 一维卷积nn.Conv1d 一般来说,一维卷积nn.Conv1d用于文本数据,只对宽度进行卷积 ...

  5. Pytorch中的Conv1d()和Conv2d()函数

    文章目录 一.Pytorch中的Conv1d()函数 二.Pytorch中的Conv2d()函数 三.Pytorch中的MaxPool1d()函数 四.pytorch中的MaxPool2d()函数 参 ...

  6. Pytorch中nn.Conv2d数据计算模拟

    Pytorch中nn.Conv2d数据计算模拟 最近在研究dgcnn网络的源码,其网络架构部分使用的是nn.Conv2d模块.在Pytorch的官方文档中,nn.Conv2d的输入数据为(B, Cin ...

  7. Pytorch中dilation(Conv2d)参数详解

    目录 一.Conv2d 二.Conv2d中的dilation参数 一.Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数(Tensor通道排列顺序是:[batch, channel, ...

  8. pytorch中如何处理RNN输入变长序列padding

    一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...

  9. pytorch贝叶斯网络_贝叶斯神经网络:2个在TensorFlow和Pytorch中完全连接

    pytorch贝叶斯网络 贝叶斯神经网络 (Bayesian Neural Net) This chapter continues the series on Bayesian deep learni ...

最新文章

  1. 3dsmax biped 骨骼姿势 对称操作
  2. navicat for mysql 怎么连接远程数据库服务器
  3. K-means算法Java实现
  4. linux路由修改密码,Linux中修改Mysql root用户密码的方法
  5. ES6学习笔记六(Iterator和for..of)
  6. 分享30个新鲜PSD网站模板免费下载
  7. 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向
  8. 揭秘阿里百亿级云客服实时分析架构是怎么炼成的?
  9. visual studio 使用快捷方法1
  10. C#: using JsonReader avoid Deserialize Json to dynamic
  11. tomcat7 性能优化
  12. kali 运行wifite时遇到的问题及解决办法
  13. linux客户端连接iscsi,配置ISCSI客户端(LINUX)redhat5-iSCSI-INITIATOR
  14. w500 安装 gentoo相关优化
  15. 计算机控制系统第二章答案,计算机控制系统习题参考答案--第2章
  16. tio对接天眼tcp协议记录
  17. 抓取检测之 End-to-end Trainable Deep Neural Network for Robotic Grasp Detection and Semantic Segmentation
  18. 急诊预检分诊管理系统的设计与实现
  19. 有什么好用的网站导航?
  20. TeamFlowy——结合Teambition与Workflowy提高生产力

热门文章

  1. 【转】webpack是什么?有什么用?怎么用?
  2. 无人机智能巡检软件设计
  3. 广东中考计算机考试,2017广东中考英语口语和听力两科合并 实行听说考试
  4. matplotlib——折线图,散点图,柱状图,饼状图
  5. 使用Joda DateTime处理时间
  6. [转]html5表单上传控件Files API
  7. linux查看网络摄像头,用网络查看usb摄像头的图像
  8. 基于微信小程序+SSM的校园生活小助手系统设计与实现 文档+项目源码及数据库文件+安装及演示视频+运行说明
  9. 对于“口袋精灵”单元测试
  10. 0422“数学口袋精灵”BUG发现