1. 介绍

我们知道,在对图像执行卷积操作时,如果不对图像边缘进行填充,卷积核将无法到达图像边缘的像素,而且卷积前后图像的尺寸也会发生变化,这会造成许多麻烦。

因此现在各大深度学习框架的卷积层实现上基本都配备了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)

2. padding的种类及其pytorch定义

padding,即边缘填充,可以分为四类:零填充,常数填充,镜像填充,重复填充

2.1 零填充

对图像或者张量的边缘进行补零填充操作:

class ZeroPad2d(ConstantPad2d):# Pads the input tensor boundaries with zero.def __init__(self, padding):super(ZeroPad2d, self).__init__(padding, 0)

2.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)

2.3 镜像填充

对图像或者张量的边缘进行镜像对称的填充,示例如下:

>>> m = nn.ReflectionPad2d(2)
>>> input = torch.arange(9).reshape(1, 1, 3, 3).float()
>>> input(0 ,0 ,.,.) =0  1  23  4  56  7  8
[torch.FloatTensor of size (1,1,3,3)]>>> m(input)(0 ,0 ,.,.) =8   7   6   7   8   7   65   4   3   4   5   4   32   1   0   1   2   1   05   4   3   4   5   4   38   7   6   7   8   7   65   4   3   4   5   4   32   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)

2.4 重复填充

对图像或者张量的边缘进行重复填充,就是说直接用边缘的像素值来填充。示例如下:

>>> m = nn.ReplicationPad2d(2)
>>> input = torch.arange(9).reshape(1, 1, 3, 3).float()
>>> input(0 ,0 ,.,.) =0  1  23  4  56  7  8
[torch.FloatTensor of size (1,1,3,3)]>>> m(input)(0 ,0 ,.,.) =0   0   0   1   2   2   20   0   0   1   2   2   20   0   0   1   2   2   23   3   3   4   5   5   56   6   6   7   8   8   86   6   6   7   8   8   86   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)

3. 实际应用

在许多计算机视觉任务中,例如图像分类,zero padding已经能够满足要求。但是不结合实际地乱用也是不行的。比方说,在图像增强/图像生成领域,zero 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)

以低光照增强任务为例,最终对比效果如下图。零填充会产生边缘伪影,而镜像填充很好地缓解了这一效应。

补充:图像处理之卷积模式及C++实现

4. 最后

PyTorch中的padding操作相关推荐

  1. Tensorflow 1.x 和 Pytorch 中 Conv2d Padding的区别

    Tensorflow 和 Pytorch 中 Conv2d Padding的区别 Pytorch中Conv2d的Padding 可以是整数,二元组,字符串三种形式. 整数(int).如果输入的padd ...

  2. pytorch中的卷积操作详解

    首先说下pytorch中的Tensor通道排列顺序是:[batch, channel, height, width] 我们常用的卷积(Conv2d)在pytorch中对应的函数是: torch.nn. ...

  3. opencv和pytorch中的warp操作函数:cv2.warpAffine, torch.nn.functional.grid_sample, cv2.warpPerspective

    关于图像的warp操作是指利用一个旋转缩放矩阵对图像进行操作. 常见的操作有,平移,绕某个点旋转,缩放. opencv中有getRotationMatrix2D,warpAffine, getAffi ...

  4. pytorch中的乘法操作

    pytorch中提供了多种函数用于乘法操作,不同函数,功能有什么不一样呢? torch.mul multiply是mul的别名,与mul用法一致 torch.mul(input, other, *, ...

  5. PyTorch中池化层的padding和ceil_mode参数设置

    在池化操作的接口中,padding和ceil_mode这两个参数会影响到输出特征图的大小.padding即对特征图大小进行扩充的像素数量:ceil_mode指明,当剩余的像素不足滤波器大小,是否仍对这 ...

  6. python中tolist_高效的张量操作 Pytorch中就占5种

    PyTorch是一个基于Python的科学包,用于使用一种称为张量的特殊数据类型执行高级操作. 虽然也有其他方式可以实现相同的效果,但今天分享的这5个操作更加方便高效,值得一试. 什么是张量? 张量是 ...

  7. pytorch中自加(+=)与普通加的区别,及原位操作

    1 导论 本文阅读时长约为3分钟. 在今年的三大顶会中,利用pytorch做研究的论文已经一枝独秀,这归功于它的易操作性.当然,pytorch中也有一些需要注意的点,如自加和普通加,在一般的语言中两者 ...

  8. 【小白学习PyTorch教程】十七、 PyTorch 中 数据集torchvision和torchtext

    @Author:Runsen 对于PyTorch加载和处理不同类型数据,官方提供了torchvision和torchtext. 之前使用 torchDataLoader类直接加载图像并将其转换为张量. ...

  9. torch中的inplace操作问题解决方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 torch中的inplace操作问题解决方法 一.inplace操作是什么? 典型的inplace操作有哪些? 二.出错案例 总结 例 ...

最新文章

  1. 对geobeansEvent事件回调函数的改进
  2. 【Android Gradle 插件】ProductFlavor 配置 ( AppExtension#externalNativeBuild 配置 | cmake 配置 | ndkBuild 配置 )
  3. 力扣35. 搜索插入位置
  4. uva 550——Multiplying by Rotation
  5. jQuery ajax实现
  6. 关于安装AccessDatabaseEngine_x64.exe 的说明
  7. 深度学习与神经网络——邱锡鹏
  8. html文档元素两部分,html元素
  9. IDEA:IDEA更换主题,好看的主题汇总
  10. 微信公众号迁移公证、迁移申请函办理方法
  11. 设计师们必须要知道的素材网站
  12. mqtt java教程_MQTT X 使用指南
  13. SP2-0734: unknown command beginning lsnrctl st... - rest of line ignored.
  14. CF1463-C. Busy Robot
  15. 2.1.2 激光雷达
  16. 3.提取线稿(PS)
  17. Project2 分段切割路面,只取一个种子点
  18. 8086怎么输出数组_鸣小亮C语言笔记(5)——数组
  19. 静态HTML明星主页 HTML+CSS 周杰伦明星页面(学生课程设计网页设计制作大作业)
  20. Experience - 6个月心得

热门文章

  1. 2021CBC街舞冠军赛南部赛区,收官之战,是热血青春的信仰回归!
  2. html怎么div剧中,css怎么使div居中?
  3. 十年磨一剑的时刻即将到来——高考
  4. python:smtplib --- SMTP 协议客户端
  5. Pipenv(项目虚拟环境与依赖管理工具)的简单使用教程
  6. 2D动画——CSS制作摩天轮
  7. Java基础Map循环遍历
  8. 【转载】柏林噪声算法
  9. 最新linux cheat安装,linux命令工具----Cheat的安装
  10. 三网话费、充值系统搭建、电费充值API接口文档