PyTorch中的padding(边缘填充)操作方式


Posted in Python onJanuary 03, 2020

简介

我们知道,在对图像执行卷积操作时,如果不对图像边缘进行填充,卷积核将无法到达图像边缘的像素,而且卷积前后图像的尺寸也会发生变化,这会造成许多麻烦。

因此现在各大深度学习框架的卷积层实现上基本都配备了padding操作,以保证图像输入输出前后的尺寸大小不变。例如,若卷积核大小为3x3,那么就应该设定padding=1,即填充1层边缘像素;若卷积核大小为7x7,那么就应该设定padding=3,填充3层边缘像素;也就是padding大小一般设定为核大小的一半。在pytorch的卷积层定义中,默认的padding为零填充。

self.conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=7, padding=3)

padding的种类及其pytorch定义

padding,即边缘填充,可以分为四类:零填充,常数填充,镜像填充,重复填充。

1.零填充

对图像或者张量的边缘进行补零填充操作:

class ZeroPad2d(ConstantPad2d):
 # Pads the input tensor boundaries with zero.
 def __init__(self, padding):
  super(ZeroPad2d, self).__init__(padding, 0)

2.常数填充

定义一个常数来对图像或者张量的边缘进行填充,若该常数等于0则等价于零填充。

class ConstantPad2d(_ConstantPadNd):
 # Pads the input tensor boundaries with a constant value.
 def __init__(self, padding, value):
  super(ConstantPad2d, self).__init__(value)
  self.padding = _quadruple(padding)

3.镜像填充

对图像或者张量的边缘进行镜像对称的填充,示例如下:

>>> m = nn.ReflectionPad2d(2)
>>> input = torch.arange(9).reshape(1, 1, 3, 3)
>>> input
 
(0 ,0 ,.,.) =
 0 1 2
 3 4 5
 6 7 8
[torch.FloatTensor of size (1,1,3,3)]
 
>>> m(input)
 
(0 ,0 ,.,.) =
 8 7 6 7 8 7 6
 5 4 3 4 5 4 3
 2 1 0 1 2 1 0
 5 4 3 4 5 4 3
 8 7 6 7 8 7 6
 5 4 3 4 5 4 3
 2 1 0 1 2 1 0
class ReflectionPad2d(_ReflectionPadNd):
 # Pads the input tensor using the reflection of the input boundary.
 
 def __init__(self, padding):
  super(ReflectionPad2d, self).__init__()
  self.padding = _quadruple(padding)

4.重复填充

对图像或者张量的边缘进行重复填充,就是说直接用边缘的像素值来填充。示例如下:

>>> m = nn.ReplicationPad2d(2)
>>> input = torch.arange(9).reshape(1, 1, 3, 3)
>>> input
 
(0 ,0 ,.,.) =
 0 1 2
 3 4 5
 6 7 8
[torch.FloatTensor of size (1,1,3,3)]
 
>>> m(input)
 
(0 ,0 ,.,.) =
 0 0 0 1 2 2 2
 0 0 0 1 2 2 2
 0 0 0 1 2 2 2
 3 3 3 4 5 5 5
 6 6 6 7 8 8 8
 6 6 6 7 8 8 8
 6 6 6 7 8 8 8
[torch.FloatTensor of size (1,1,7,7)]
class ReplicationPad2d(_ReplicationPadNd):
 # Pads the input tensor using replication of the input boundary.
 
 def __init__(self, padding):
  super(ReplicationPad2d, self).__init__()
  self.padding = _quadruple(padding)

实际应用

在许多计算机视觉任务中,例如图像分类,zero padding已经能够满足要求。但是不结合实际地乱用也是不行的。比方说,在图像增强/图像生成领域,zero padding可能会导致边缘出现伪影,如下所示:

PyTorch中的padding(边缘填充)操作方式

这时候,可以改用镜像填充来代替零填充操作。我们定义一个新的padding层,然后把卷积层里的padding参数置为0.

具体写法如下:

class DEMO(nn.Module):
 
 def __init__(self):
  super(DEMO, self).__init__()
  self.pad = nn.ReflectionPad2d(1)
  self.conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, padding=0)
 
 def forward(self, x):
  x = self.pad(x)
  x = self.conv(x)
  return F.relu(x)

以低光照增强任务为例,最终对比效果如下图。零填充会产生边缘伪影,而镜像填充很好地缓解了这一效应。

PyTorch中的padding(边缘填充)操作方式

以上这篇PyTorch中的padding(边缘填充)操作方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现telnet客户端的方法
Apr 15 Python
Python中表示字符串的三种方法
Sep 06 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Python实现Linux监控的方法
May 16 Python
Python实现最大子序和的方法示例
Jul 05 Python
selenium2.0中常用的python函数汇总
Aug 05 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Pyqt5自适应布局实例
Dec 13 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
在keras里实现自定义上采样层
Jun 28 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 #Python
Python如何使用字符打印照片
Jan 03 #Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 #Python
如何基于python实现画不同品种的樱花树
Jan 03 #Python
Python基础之变量基本用法与进阶详解
Jan 03 #Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 #Python
Python实现银行账户资金交易管理系统
Jan 03 #Python
You might like
PHP执行速率优化技巧小结
2008/03/15 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
JS之小练习代码
2008/10/12 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
js初始化验证实例详解
2016/11/26 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
python有证书的加密解密实现方法
2014/11/19 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python装饰器与递归算法详解
2016/02/18 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
团组织关系介绍信
2014/01/12 职场文书
观后感格式
2015/06/19 职场文书
2016公司中秋节寄语
2015/12/07 职场文书