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的微信聊天机器人示例代码
Mar 03 Python
Python 调用Java实例详解
Jun 02 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
详解Python的三种拷贝方式
Feb 11 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
Keras实现DenseNet结构操作
Jul 06 Python
详解Django中 render() 函数的使用方法
Apr 22 Python
浅谈Python类的单继承相关知识
May 12 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 Python
python装饰器代码解析
Mar 23 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
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
PHP文件与目录操作示例
2016/12/24 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python实现装饰器、描述符
2018/02/28 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
对python的输出和输出格式详解
2018/12/08 Python
python的turtle库使用详解
2019/05/10 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
经典大学生求职信范文
2014/01/06 职场文书
大学自我评价
2014/02/12 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
质量主管工作职责
2014/09/26 职场文书
2014年环保工作总结
2014/11/26 职场文书
2015年植树节活动总结
2015/02/06 职场文书
项目合作意向书
2015/05/08 职场文书
消防验收申请报告
2015/05/15 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL