一般我们会认为2维卷积的计算分为了以下3类:

1.full   2.same   3. valid

参考:https://cn.mathworks.com/help/matlab/ref/conv2.html?

same和valid相信各位同学都不陌生。Valid指不进行padding操作,而same则是通过padding使得卷积之后输出的feature map尺寸保持不变(相对于输入图片)。当然,same模式不代表完全输入输出尺寸一样,也跟卷积核的步长有关系。比如图片尺寸6*6,步长为2,那么same后输出的图片尺寸应为6/2 = 3。那么,问题来了,如果输入图片是5*5,步长为2呢?如果选择padding=(kernel_size-1)/2,那么输出也是3*3。

valid

same

(图片来源:卷积的三种模式:full, same, valid)

这个就是我们今天要重点讨论的问题:当步长大于1时,不同尺寸的feature map在选择同一padding = (kernel_size-1)/2时,可以得到相同尺寸的输出。

这一点和标题的“反卷积”有什么关系呢?还有我们是不是忘了full模式?那好我们慢慢讲来。

full即反卷积

先让我说出一个不严谨但方便理解的想法:

Valid就是“纯净”的卷积,full是“纯净”的反卷积

所谓“纯净”是指没有进行padding的操作。而在“不纯净”的操作中有一种特例使得输入输出尺寸符合以步长为比例的预期,称之为same。

参考:深度学习 | 反卷积/转置卷积 的理解 transposed conv/deconv

资料

full

stride>1的反卷积

步长大于1的反卷积在计算时,在其输入特征单元之间插入strider-1个0,插入0后把其看出是新的特征输入。反卷积有时候也被叫做Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。参考资料:Transposed Convolution, Fractionally Strided Convolution or Deconvolution

结合动图查看是不是比较形象呢?打个比方就像是原本的卷积操作一步一步把数据从输入映射到输出,步长为二时嘛就跨越着映射从输入那边少拿了东西,输出自然也就少了。而反卷积则是半步半步(小数步长)映射,从输入拿到一个东西居然要映射到输出两次,输出自然就多了嘛。(不严谨的理解哈)

pytorch中的output_padding参数

说了半天终于要引出我写这篇博文的起因啦,那就是:pytorch中的

nn.ConvTranspose2d()

在传入参数时除了常见的输入输出通道数、卷积核尺寸等,还会有一个稍微令人费解的参数:output_padding

这个参数在做步长为1的反卷积时是不用在意的。然而当步长大于1了,就需要手动设置以免网络出错。那么这个参数究竟是干嘛的呢?其实源代码中有说明:

有没有一种恍然大悟的感觉(好吧也许没有),现在是不是有点明白我前面为什么要讲

  1. 步长大于1卷积尺寸有多种对应的情况;
  2. 反卷积是卷积的逆向运算(在尺寸计算方面)。

问题就是,不同尺寸的图片经过卷积运算能得到相同尺寸的输出,那么作为逆运算,同样的一张输入图像经过反卷积是否会有不同尺寸的合法输出?这样的话就存在争议了呀。我们来验证一下是否的确会出现这种情况:

借用参考博文中的例子:

可以看到,在卷积过程中,7*7的输入尺寸+步长为2+卷积核3*3 = 3*3输出尺寸。这是一个完美的卷积核滑动过程。但是观察图中用蓝笔画×的区域我们知道,那块地方是不进行卷积的也就是说如果那里有数据,也就是假设输入8*8,那么输出仍然是3*3.至于原因原文作者如此解释:

如果商不是一个整数,就需要我们向下取整。用符号⌊⌋⌊⌋表示,也叫做进行进行地板除(floor)这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的 3×3 的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。

那么反卷积呢?我们很自然可以想到,3*3的输入进行步长为2的反卷积,7*7的输出与8*8的输出都将会是合法的。但哪个是我们需要的呢?

仍然是这副图,我们注意到它实际上是使用了same填充的反卷积(蓝色的输入图像外层有p=(s-1)/2的填充),因此我们实际上是期待其输入输出是按照以步长为比例的(2)(PS:上面说的3*3输入步长为2,则7与8是合法输出那并不是same,是“纯净”的反卷积)但是我们看到的是:输入蓝色3*3,输出绿色5*5. 这就不是我们的预期了呀,然而人家5*5确实也是合法输出。可是基于前面的讨论我们知道6*6在这里也是合法输出,那么选择哪个合适呢?

output_padding参数作用

看到了确实有争议情况的存在。那么pytorch就机智地提出了解决办法,使用output_padding参数消除争议,那么它是怎么样发挥作用的呢?

首先我们要认同一个前提:大多数情况下我们都希望经过卷积/反卷积处理后的图像尺寸比例与步长相等,也就是same模式。因此pytorch将参数padding(注意与output_padding区别)建议设置为(kernel_size - 1)/2 ,在源代码注释中可以看到:

接下来我们再给出反卷积尺寸变化计算公式

稍微一运算就能够知道(此处先无视output_padding),要满足输入输出尺寸满足预期,

需要:padding = (kernel_size - stride)/2

对比一下pytorch的建议:padding = (kernel_size - 1)/2

现在再把output_padding考虑进来,也就是说,最好的output_padding应该取stride-1.这样输入输出才能够成比例。那取别的值运算可以吗?可以,不会妨碍到这一个反卷积的计算,但是在网络的后面进行与尺寸有关的操作时就要注意了,此时的输出不是输入尺寸* stride了。

总结

由于卷积核滑动过程中,边界情况的不确定,使得在运算步长大于1的反卷积时会出现多种合法输出尺寸,pytorch的反卷积层提供了output_padding供使用者选择输出,一般情况下我们希望输入输出尺寸以步长为比例,因此output_padding一般取stride-1,同时padding取 (kernel_size - 1)/2 。

参考资料:卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

反卷积原理 + pytorch反卷积层参数output_padding相关推荐

  1. pytorch:固定部分层参数,固定单个模型

    文章目录 固定部分层参数 固定指定层的参数 不同层设置不同的学习率 固定部分层参数 class RESNET_attention(nn.Module):def __init__(self, model ...

  2. pytorch——冻结某层参数

    参考链接: https://blog.csdn.net/qq_41368074/article/details/107860126 https://blog.csdn.net/Code_Mart/ar ...

  3. 反卷积原理和实际代码详细讲解!

    做的项目里涉及到了反卷积,上网查了很多资料发现有的只讲了原理,没有直观的代码实践,有些讲了代码却又完全忽视原理,所以想要以这篇博文做一个小小的整合,方便以后查阅. 文章目录 反卷积原理 首先来看卷积操 ...

  4. 深度学习(二)神经网络中的卷积和反卷积原理

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9579392.html 一.卷积 在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作, ...

  5. pytorch 反卷积 可视化_手推反卷积

    先手推卷积热个身 在推导反卷积之前,先推导一下卷积. 假设输入为 ,卷积核为 ,输出大小的计算公式为 .当 时,输出为 . 将输入矩阵转成一个 的列阵,卷积核扩展为 的矩阵,即 则 , 所以 . 用p ...

  6. Pytorch 学习(6):Pytorch中的torch.nn Convolution Layers 卷积层参数初始化

    Pytorch 学习(6):Pytorch中的torch.nn  Convolution Layers  卷积层参数初始化 class Conv1d(_ConvNd):......def __init ...

  7. 空洞卷积原理详解及其pytorch代码实现

    一.空洞卷积 1.1 普通小卷积核卷积-池化-再上采样会出现的问题 Up-sampling / pooling layer (e.g. bilinear interpolation) is deter ...

  8. 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  9. 卷积层参数个数计算公式,卷积操作的计算复杂度

    卷积神经网络算法是什么? 一维构筑.二维构筑.全卷积构筑. 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedfor ...

最新文章

  1. Python基础之标准库datetime 时间与日期的使用
  2. 数据结构之迷宫问题求解(一)利用栈与递归求解出口
  3. 算法导论之NP完全性和近似算法
  4. 你知道socket.io中connect事件和connection事件的区别吗?
  5. Codeup墓地-问题 D: 继续畅通工程
  6. Qt文档阅读笔记-Visual Parent的初步理解(获取QML中的根节点及其子结点)
  7. 【MySQL】ERROR 1412 (HY000) Table definition has changed, please retry transaction
  8. 为什么看别人的网站排名都在第一页?有可能是以下三种原因
  9. intelj maven 指定编译器版本
  10. Uml工具StarUML破解
  11. 空间解析几何中那些图形和方程(大彻大悟版)
  12. CUDA Occupancy Calculator中计算占用率
  13. java打印指定宽度_如何设置图片打印尺寸,长与宽指定大小(CM)?
  14. Java中的package(包)
  15. 科创板发行上市审核44个问题解答汇编(总11期)
  16. Get busy living--or get busy dying
  17. 用计算机处理图像属于啥技术,计算机图像处理技术在网页设计中的应用
  18. 2022 极术通讯-从CPU、DSA到软硬件融合
  19. 记戴尔科技峰会2017
  20. python的 networkx画网络结构图,节点大小能够随权重变化

热门文章

  1. 科普】华为手机支付保护中心有什么用?
  2. 滴滴助力 2020 中国开源年会 暨 阿帕奇中国路演
  3. 使用加速人生后 sqlserver 本地数据库打不开
  4. EDiary(电子日记本)终于发布
  5. Excel对比两行数据是否相同?
  6. 第二期Go开源说实录:GORM 剖析与最佳实践
  7. 虚拟机异常关机,报错找不到vmdx文件,文件名增加flat的解决方法
  8. 开发板上新抢先知丨居然可以用来跑游戏?
  9. JAVA递归函数示例 - 阶乘计算
  10. 如何学习新概念英语第四册