1.首先先定义进行卷积的参数:

  • 输入特征图为高宽一样的Hin*Hin大小的x
  • 卷积核大小kernel_size
  • 步长stride
  • padding填充数(填充0)
  • 输出特征图为Hout*Hout大小的y

计算式子为:

Hout =  floor( Hin + 2*padding - kernel_size / stride) + 1

2.然后实现上面的卷积的转置卷积

定义其参数为:

  • 输入特征图为高宽一样的Hout*Hout大小的y
  • 卷积核大小kernel_size
  • 步长stride
  • paddingnew 填充数(填充0)
  • 输出特征图为Hin*Hin大小的x

逆卷积的过程主要分两步:

  • 对输入的特征图y进行变换,得到新的特征图ynew
  1. 内部变换,与卷积时设置的stride相关
  2. 外部变换,与卷积时设置的padding相关
  • 根据得到的特征图进行卷积即可

1)对输入的特征图y进行变换,得到新的特征图ynew

1》内部变换

当卷积时设置的stride>1时,将对输入的特征图y进行插值操作(interpolation)。

即需要在输入的特征图y的每个相邻值之间插入(stride-1)行和列0,因为特征图中能够插入的相邻位置有(height-1)个位置,所以此时得到的特征图的大小由Hout*Hout(Hout即height) 变为新的 Hout_new*Hout_new,即[Hout + (stride-1) * (Hout-1)] * [Hout + (stride-1) * (Hout-1)]

2》外部变换

为了实现由Hout*Hout大小的y逆卷积得到Hin*Hin大小的x,还需要设置paddingnew的值为(kernel_size - padding - 1),这里的padding是卷积操作时设置的padding值

所以计算式子变为:

Hin =  floor( [Hout_new + 2*paddingnew - kernel_size] / stride') + 1

⚠️该式子变换后,定义向下取整的分母stride'值为定值1

Hout_new和paddingnew的值代入上面的式子,即变为:

Hin =  floor( Hout + (stride-1) * (Hout-1) + 2*(kernel_size - padding - 1) - kernel_size) + 1

化简为:

Hin =  floor( (Hout - 1) * stride - 2*padding + kernel_size - 1) + 1

= (Hout - 1) * stride - 2*padding + kernel_size

这样式子使的卷积Conv2d和逆卷积ConvTranspose2d在初始化时具有相同的参数,而在输入和输出形状方面互为倒数。

所以这个式子其实就是官网给出的式子:

可见这里没考虑output_padding

output_padding的作用:可见nn.ConvTranspose2d的参数output_padding的作用

3.下面举例说明

https://github.com/vdumoulin/conv_arithmetic#convolution-arithmetic

1)当stride=1时,就不会进行插值操作,只会进行padding,举例说明:

卷积操作为:

蓝色为输入特征图Hin*Hin=4*4,绿色为输出特征图Hout*Hout=2*2,卷积核kernel_size=3, stride=1

根据式子Hout =  floor( Hin + 2*padding - kernel_size / stride) + 1

可得padding=0

其对应的逆卷积操作为:

蓝色为输入特征图Hout*Hout=2*2,绿色为输出特征图Hin*Hin=4*4,卷积核kernel_size=3, stride=1

卷积时的padding=0

将这些值代入上面的式子Hin = (Hout - 1) * stride - 2*padding + kernel_size

果然输入Hout*Hout=2*2能得到输出Hin*Hin=4*4

变形过程为:

paddingnew = kernel_size - padding -1 = 3 -0 -1 = 2

所以可见下方的蓝色最后的大小为7*7 = Hout + 2*paddingnew = 2 + 2*2 = 6

⚠️这里可见是有padding的,为什么定义是为no padding呢?

这是因为它对应的卷积操作的padding=0

1)当stride=2时,进行插值和padding操作,举例说明:

卷积操作为:

蓝色为输入特征图Hin*Hin=5*5,绿色为输出特征图Hout*Hout=3*3,卷积核kernel_size=3, stride=2

根据式子Hout =  floor( Hin + 2*padding - kernel_size / stride) + 1

可得padding=1

其对应的逆卷积操作为:

蓝色为输入特征图Hout*Hout=3*3,绿色为输出特征图Hin*Hin=5*5,卷积核kernel_size=3,stride=2

卷积时的padding=1

将这些值代入上面的式子Hin = (Hout - 1) * stride - 2*padding + kernel_size

果然输入Hout*Hout=3*3能得到输出Hin*Hin=5*5

变形操作为:

Hout_new = Hout + (stride-1) * (Hout-1) = 3 + (2-1)*(3-1) = 5

paddingnew = kernel_size - padding -1 = 3 -1 -1 = 1

所以可见下方的蓝色最后的大小为7*7 = Hout_new + 2*paddingnew = 5 + 2*1 = 7

⚠️因为这里的逆卷积对应的卷积操作的padding= 1,所以这里不是no padding,而是padding

深度学习笔记_基本概念_逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)相关推荐

  1. 深度学习笔记(三十一)三维卷积及卷积神经网络

    一.RGB三维图像的卷积 首先复习以下二维卷积运算的过程: 然后让我们看看三维图像如何进行有效的卷积运算. 计算方法和二维卷积类似,从三维图像中划分出3×3×33\times3\times33×3×3 ...

  2. 深度学习笔记7 Working with Large Images 卷积特征提取

    动机 在用稀疏自编码器对8*8 或28*28等小图像提取特征时是可行的,但是若对大图像学习整幅图像的特征,将会非常耗时.因此需要把这种"全连接"的设计改为"部分联通&qu ...

  3. 深度学习笔记(22) Padding

    深度学习笔记(22) Padding 1. 卷积的缺陷 2. Padding 3. Valid卷积 4. Same卷积 5. 奇数的过滤器 1. 卷积的缺陷 为了构建深度神经网络,需要学会使用的一个基 ...

  4. octave深度学习_【深度学习笔记】(一)Octave

    [深度学习笔记](一)Octave Octave是一种面向科学数学运算的原型语言,内置了强大的数学函数及图形展示工具.原型prototyping设计的意思是使用ovtave进行算法设计.实现.验证等过 ...

  5. 深度学习与计算机视觉系列(4)_最优化与随机梯度下降\数据预处理,正则化与损失函数

    1. 引言 上一节深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器中提到两个对图像识别至关重要的概念: 用于把原始像素信息映射到不同类别得分的得分函数/score function 用 ...

  6. 深度学习+计算机视觉(CV)_第0章_课程介绍

    深度学习+计算机视觉(CV)_第0章_课程介绍 文章目录 深度学习+计算机视觉(CV)_第0章_课程介绍 深度学习 1.什么是深度学习 2 发展历史(了解) 计算机视觉 1.计算机视觉定义 2.常见任 ...

  7. 深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答

    深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答 作业内容翻译:@胡杨(superhy199148@hotmail.com) && @胥可(feitongxiaok ...

  8. 深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子

    深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子 作者:寒小阳  时间:2016年1月.  出处:http://blog.csdn.net/han_xiaoyang/article/de ...

  9. 深度学习与计算机视觉系列(8)_神经网络训练与注意点

    深度学习与计算机视觉系列(8)_神经网络训练与注意点 作者:寒小阳  时间:2016年1月.  出处:http://blog.csdn.net/han_xiaoyang/article/details ...

  10. 深度学习与计算机视觉系列(10)_细说卷积神经网络

    转载自: 深度学习与计算机视觉系列(10)_细说卷积神经网络 - 龙心尘 - 博客频道 - CSDN.NET http://blog.csdn.net/longxinchen_ml/article/d ...

最新文章

  1. WPF入门知识(学习)
  2. android VectorDrawable使用笔记(三)
  3. 21. Merge Two Sorted Lists
  4. github生成密钥
  5. celery异步邮件发送系统出现django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM
  6. 机器学习线性回归算法实验报告_从零实现机器学习算法(九)线性回归
  7. 红米Note 7 Pro彩排PPT露出:可降低90%入水量?
  8. 入门-什么是webshell?
  9. 素数筛(快速筛)-爱拉托斯特尼筛法+欧拉筛
  10. Linux软件安装到哪个目录
  11. kotlin的属性代理
  12. ascii码表 java,JAVA实现打印ascii码表代码
  13. python实现批量将域名解析成ip
  14. 数据库架构(一) 插入数据库
  15. 详细了解SQLITE 优缺点 性能测试
  16. 2021年6月上市公司新闻舆论事件分析报告合集
  17. 每个系统管理员都要知道的 30 个 Linux 系统监控工具
  18. 投稿论文图片分辨率达不到要求的解决方案
  19. 网络信息传播中图像识别技术的意义
  20. 虚幻4游戏引擎的安装

热门文章

  1. clip和z-index的用法
  2. day4_监控日志的脚本
  3. python 匿名函数 与 重要的内置函数
  4. WebAssembly 介绍
  5. WebBrowser.ObjectForScripting 属性的使用
  6. 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
  7. Linux 引导流程解析
  8. 【java】 jsp网页表单数据跨页面传递
  9. display:none与visibility:hidden的区别 ,还有html5的新属性hidden
  10. 如何使用Java代码获取Android移动终端Mac地址