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提取网页中超链接的方法
Sep 18 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
使用python3构建文件传输的方法
Feb 13 Python
python pandas 时间日期的处理实现
Jul 30 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
基于python 凸包问题的解决
Apr 16 Python
python脚本定时发送邮件
Dec 22 Python
Django中的DateTimeField和DateField实现
Feb 24 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中的正规表达式(二)
2006/10/09 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
php获取操作系统语言代码
2013/11/04 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
大学生个人简历自我评价
2013/11/16 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript