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. Elasticsearch BM25相关度算法超详细解释

    Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...

  2. .htaccess语法之RewriteCond与RewriteRule指令格式详细解释

    htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签:  htaccess it 分类: 网络 上文htacc ...

  3. cookie的详细解释

    突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...

  4. tar命令的详细解释

    tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报  分类: linux/unix ...

  5. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

  6. C语言 - 结构体(struct)比特字段(:) 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  7. 姿势体系结构的详细解释 -- C

    我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include &l ...

  8. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

  9. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

随机推荐

  1. JAVA_OPTS设置

    AVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JVM:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k" -se ...

  2. Netty1:初识Netty

    为什么使用Netty Netty是业界最流行的NIO框架之一,它的健壮性.功能.性能.可定制性.可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明.对于为什么使用Netty这个话 ...

  3. Objective-C 学习 (二):Objective-C 实战之Hello World

    在Objective-C 学习 (一):Objective-C 概述 学习了OC的基本知识,本节我们来实战一下: #import <Foundation/Foundation.h> // ...

  4. SUSE12SP3-Mycat(4)rule.xml配置详解

    简介 rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义.我们可以灵活的对表使用不同的分片算法, 或者对表使用相同的算法但具体的参数不同.这个文件里面主要有 tableRule 和 fu ...

  5. 支持向量机(SVM)之数学公式详细推导

    一.概述 1.含义: 支持向量机(support vector machine,SVM)是一种二类分类器,它的基本模型是定义在特征空间上的间隔最大化的线性分类器,通过引入核函数,也可以作为非线性分类器 ...

  6. 网络协议 16 - DNS 协议:网络世界的地址簿

    [前五篇]系列文章传送门: 网络协议 11 - Socket 编程(下):眼见为实耳听为虚 网络协议 12 - HTTP 协议:常用而不简单 网络协议 13 - HTTPS 协议:加密路上无尽头 网络 ...

  7. [区块链] 加密算法——Hash算法(进阶)

    为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户. 在前边 ...

  8. springboot~@Query到DTO对象

    我们有时在进行开发过程中,使用jpa的@Query注解去选择多张表然后返回一个DTO对象,这个时候我们需要特殊处理一下,因为默认情况下,你的jpa代码是不认DTO对象的. 参考文章:https://s ...

  9. 使用 ASP.NET Core MVC 创建 Web API(二)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...

  10. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...