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中操作文件之truncate()方法的使用教程
May 25 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
详解python基础之while循环及if判断
Aug 24 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
python实现移位加密和解密
Mar 22 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
使用Pytorch训练two-head网络的操作
May 28 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
php微信开发之百度天气预报
2016/11/18 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python定时执行指定函数的方法
2015/05/27 Python
利用Python实现图书超期提醒
2016/08/02 Python
Python冲顶大会 快来答题!
2018/01/17 Python
python定时关机小脚本
2018/06/20 Python
python实现图书借阅系统
2019/02/20 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
2015年结对帮扶工作总结
2015/05/04 职场文书
工作后的感想
2015/08/07 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
V Rising 服务器搭建图文教程
2022/06/16 Servers