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写的一个squid访问日志分析的小程序
Sep 17 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
Python采用Django开发自己的博客系统
Sep 29 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python 字符串追加实例
Jul 20 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
通过实例学习Python Excel操作
Jan 06 Python
Softmax函数原理及Python实现过程解析
May 22 Python
python数据类型强制转换实例详解
Jun 22 Python
Python中zipfile压缩包模块的使用
May 14 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
python绘制云雨图raincloud plot
Aug 05 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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
php数组合并的二种方法
2014/03/21 PHP
yii操作cookie实例简介
2014/07/09 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
JS交换变量的方法
2015/01/21 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
js实现简单的验证码
2015/12/25 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
django Admin文档生成器使用详解
2019/07/22 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
Python绘图实现显示中文
2019/12/04 Python
Python爬取梨视频的示例
2021/01/29 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
高中竞选班长演讲稿
2014/04/24 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
公务员政审材料范文
2014/12/23 职场文书
开平碉楼导游词
2015/02/06 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
手把手教你导入Go语言第三方库
2021/08/04 Golang
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android