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协程用法实例分析
Jun 04 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
Django处理文件上传File Uploads的实例
May 28 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Python socket非阻塞模块应用示例
Sep 12 Python
Python requests上传文件实现步骤
Sep 15 Python
python 贪心算法的实现
Sep 18 Python
selenium+headless chrome爬虫的实现示例
Jan 08 Python
详解Python 中的 defaultdict 数据类型
Feb 22 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删除非空目录的函数代码小结
2013/02/28 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
2018/07/31 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
js简易版购物车功能
2017/06/17 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
幼儿园小班教师寄语
2014/04/03 职场文书
有关环保的标语
2014/06/13 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
教师自荐信范文
2015/03/06 职场文书
作弊检讨书范文
2015/05/06 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
毕业证明模板
2015/06/19 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL