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 server实例
Apr 29 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
Python3基础教程之递归函数简单示例
Jun 07 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
python实现银行管理系统
Oct 25 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
Spy++的使用方法及下载教程
Jan 29 Python
Python编程编写完善的命令行工具
Sep 15 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读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
2019/03/21 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
react基本安装与测试示例
2020/04/27 Javascript
最基础的Python的socket编程入门教程
2015/04/23 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
pandas实现导出数据的四种方式
2020/12/13 Python
python中实现栈的三种方法
2020/12/19 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
UDP协议功能
2013/01/06 面试题
乡镇保密工作责任书
2014/07/28 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS