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中subprocess的简单使用示例
Jul 28 Python
Python中字典的setdefault()方法教程
Feb 07 Python
Python使用openpyxl读写excel文件的方法
Jun 30 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python中return self的用法详解
Jul 27 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
scrapy-splash简单使用详解
Feb 21 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
基于mysql的论坛(1)
2006/10/09 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
python实现2014火车票查询代码分享
2014/01/10 Python
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
python常用排序算法的实现代码
2019/11/08 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
监理资料员岗位职责
2014/01/03 职场文书
八年级美术教学反思
2014/02/02 职场文书
运动会获奖感言
2014/02/11 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
三八妇女节寄语
2015/02/27 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
人事任命通知
2015/04/20 职场文书
小学英语听课心得体会
2016/01/14 职场文书