Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别
Tensorflow 和 Pytorch 中 Conv2d Padding的区别
Pytorch中Conv2d的Padding
可以是整数,二元组,字符串三种形式。
- 整数(int)。如果输入的padding为整数则代表在 上,下,左,右 四个方向都充填一样数量的0或者由padding_mode 确定的padding类型。
- 二元组(tuple)。如果输入的padding 为二元组(padding[0],padding[1]),则padding[0]代表上下两个方向的padding大小,padding[1]则代表左右两个方向的padding大小。
- 字符串(str)。字符串模式可选参数为
valid
和same
,valid
模式表示不充填,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
可以是 字符串和列表两种形式:
- 字符串。 字符串是可选
SAME
和VALID
。SAME
模式下,根据以下公式计算各方向的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的方向和大小,只关心输出的形状是不是原来形状的整数倍时,就可以无脑使用SAME
padding 模式,tensorflow会自动帮你计算好要padding的大小。
VALID
模式下,与pytorch一样,直接不padding 。当输入形状不能整除卷积核大小,滑动窗口滑到最右边发现无法满足卷积条件时,多出来的那部分直接会被舍弃掉,输出的形状为:
OutH=InH−filterH+1strideHOut_{H} = \frac{In_H - filter_H + 1}{stride_{H}} OutH=strideHInH−filterH+1
OutW=InW−filterW+1strideWOut_{W} = \frac{In_W - filter_W + 1}{stride_{W}} OutW=strideWInW−filterW+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=strideHInH+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=strideWInW+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的区别相关推荐
- PyTorch中的padding操作
1. 介绍 我们知道,在对图像执行卷积操作时,如果不对图像边缘进行填充,卷积核将无法到达图像边缘的像素,而且卷积前后图像的尺寸也会发生变化,这会造成许多麻烦. 因此现在各大深度学习框架的卷积层实现上基 ...
- pytorch中load和load_state_dict区别
torch.load 加载的是训练好的模型 例如 torch.load("ad.pth") 而load_state_dict是net的一个方法 是将torch.load加载出来的数 ...
- Pytorch中 .numpy() .item() .cpu() 区别
.numpy() 与 .item() 这两个可以归为一类,是将Tensor变量转换为非Tensor变量. t.numpy()将Tensor变量转换为ndarray变量,其中t是一个Tensor变量,可 ...
- PyTorch中的nn.Conv1d与nn.Conv2d
本文主要介绍PyTorch中的nn.Conv1d和nn.Conv2d方法,并给出相应代码示例,加深理解. 一维卷积nn.Conv1d 一般来说,一维卷积nn.Conv1d用于文本数据,只对宽度进行卷积 ...
- Pytorch中的Conv1d()和Conv2d()函数
文章目录 一.Pytorch中的Conv1d()函数 二.Pytorch中的Conv2d()函数 三.Pytorch中的MaxPool1d()函数 四.pytorch中的MaxPool2d()函数 参 ...
- Pytorch中nn.Conv2d数据计算模拟
Pytorch中nn.Conv2d数据计算模拟 最近在研究dgcnn网络的源码,其网络架构部分使用的是nn.Conv2d模块.在Pytorch的官方文档中,nn.Conv2d的输入数据为(B, Cin ...
- Pytorch中dilation(Conv2d)参数详解
目录 一.Conv2d 二.Conv2d中的dilation参数 一.Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数(Tensor通道排列顺序是:[batch, channel, ...
- pytorch中如何处理RNN输入变长序列padding
一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...
- pytorch贝叶斯网络_贝叶斯神经网络:2个在TensorFlow和Pytorch中完全连接
pytorch贝叶斯网络 贝叶斯神经网络 (Bayesian Neural Net) This chapter continues the series on Bayesian deep learni ...
最新文章
- 3dsmax biped 骨骼姿势 对称操作
- navicat for mysql 怎么连接远程数据库服务器
- K-means算法Java实现
- linux路由修改密码,Linux中修改Mysql root用户密码的方法
- ES6学习笔记六(Iterator和for..of)
- 分享30个新鲜PSD网站模板免费下载
- 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向
- 揭秘阿里百亿级云客服实时分析架构是怎么炼成的?
- visual studio 使用快捷方法1
- C#: using JsonReader avoid Deserialize Json to dynamic
- tomcat7 性能优化
- kali 运行wifite时遇到的问题及解决办法
- linux客户端连接iscsi,配置ISCSI客户端(LINUX)redhat5-iSCSI-INITIATOR
- w500 安装 gentoo相关优化
- 计算机控制系统第二章答案,计算机控制系统习题参考答案--第2章
- tio对接天眼tcp协议记录
- 抓取检测之 End-to-end Trainable Deep Neural Network for Robotic Grasp Detection and Semantic Segmentation
- 急诊预检分诊管理系统的设计与实现
- 有什么好用的网站导航?
- TeamFlowy——结合Teambition与Workflowy提高生产力
热门文章
- 【转】webpack是什么?有什么用?怎么用?
- 无人机智能巡检软件设计
- 广东中考计算机考试,2017广东中考英语口语和听力两科合并 实行听说考试
- matplotlib——折线图,散点图,柱状图,饼状图
- 使用Joda DateTime处理时间
- [转]html5表单上传控件Files API
- linux查看网络摄像头,用网络查看usb摄像头的图像
- 基于微信小程序+SSM的校园生活小助手系统设计与实现 文档+项目源码及数据库文件+安装及演示视频+运行说明
- 对于“口袋精灵”单元测试
- 0422“数学口袋精灵”BUG发现