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中使用异步Socket编程性能测试
Jun 25 Python
Python数据类型详解(一)字符串
May 08 Python
python if not in 多条件判断代码
Sep 21 Python
python实现扫描日志关键字的示例
Apr 28 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
python提取xml里面的链接源码详解
Oct 15 Python
python创建学生管理系统
Nov 22 Python
Python如何访问字符串中的值
Feb 09 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
PyQt QMainWindow的使用示例
Mar 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php的一个登录的类 [推荐]
2007/03/16 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
jquery操作select大全
2014/04/25 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
django2.0扩展用户字段示例
2019/02/13 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
python中metaclass原理与用法详解
2019/06/25 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python 初始化一个定长的数组实例
2019/12/02 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
班组长竞聘书
2014/03/31 职场文书
小学体育教学随笔
2015/08/14 职场文书
初中生物教学反思
2016/02/20 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书