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导出Excel图表以及导出为图片的方法
Nov 07 Python
python的unittest测试类代码实例
Dec 07 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
Python批量处理csv并保存过程解析
May 16 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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输入流php://input使用浅析
2014/09/02 PHP
php实现可逆加密的方法
2015/08/11 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
javascript读取RSS数据
2007/01/20 Javascript
提高网站信任度的技巧
2008/10/17 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
用python代码做configure文件
2014/07/20 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Python 实现链表实例代码
2017/04/07 Python
Python3最长回文子串算法示例
2019/03/04 Python
Django中的静态文件管理过程解析
2019/08/01 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
小学生国旗下演讲稿
2014/04/25 职场文书
留学推荐信范文
2014/05/10 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
golang中的struct操作
2021/11/11 Golang
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android