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基础教程之获取本机ip数据包示例
Feb 10 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
python实现按长宽比缩放图片
Jun 07 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 Python
python图片灰度化处理的几种方法
Jun 23 Python
Python学习之os包使用教程详解
Mar 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
需要发散思维学习PHP
2009/06/29 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python有序字典简单实现方法示例
2017/09/28 Python
Python中常见的异常总结
2018/02/20 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
详解python读取和输出到txt
2019/03/29 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
教师节学生演讲稿
2014/09/03 职场文书
社区元宵节活动总结
2015/02/06 职场文书
商务代表岗位职责
2015/02/15 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书