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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
python中for循环变量作用域及用法详解
Nov 05 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
什么是Python中的匿名函数
Jun 02 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python编程super应用场景及示例解析
Oct 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中simplexml_load_string函数使用说明
2011/01/01 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python机器学习之神经网络(一)
2017/12/20 Python
详解Python 解压缩文件
2019/04/09 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python在地图上画比例的实例详解
2020/11/13 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
学生安全责任书
2014/04/15 职场文书
工商管理专业自荐信
2014/06/03 职场文书
体育专业求职信
2014/07/16 职场文书
中秋晚会活动方案
2014/08/31 职场文书
普通员工辞职信范文
2015/05/12 职场文书