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. Codeforces Round #539 (Div. 2) - D. Sasha and One More Name(思维)

    Problem   Codeforces Round #539 (Div. 2) - D. Sasha and One More Name Time Limit: 1000 mSec Problem ...

  2. 微信公众号支付提示mch_id参数格式错误

    背景: .Net MVC微信公众号支付功能 问题: 今天在做网站微信支付的时候,一直提示“微信公众号支付提示mch_id参数格式错误” ! 解决方法: 其实这个问题一般并不是说你配置有错,首先它提示你 ...

  3. synchronized的四种作用域以及不能被继承解析

    synchronized是java中用于同步的关键字,其典型的作用域如下所示. 1 对象锁 @Slf4j public class SynchronizedExample1 { private fin ...

  4. python进程和线程(五)

    python的进程 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包m ...

  5. ASP.NET MVC权限控制思路

    在系统开发的时候一个老生常谈的权限管理问题,翻阅了很多的网络资料,但是总感觉离实际使用还有一段距离,其实权限控制无非就几个“请求.页面按钮.字段显示”, 对于前端权限就需要配合JS了, 这里主要展示我 ...

  6. 【工利其器】必会工具之(二)Android开发者官网篇

    前言 当刚开始踏入Android程序员这个行业的时候,想必绝大多数的人都和笔者一样,热血沸腾,激情四射,买了很多讲解Android开发的书籍.当开发某个功能需要学习某方面知识的时候,大家又成了“面向百 ...

  7. java~集合的介绍和使用

    大叔转载,原文地址:http://www.700net.com/rewrite.php/read-4491.html 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了 ...

  8. Fescar(Seata)-Springcloud流程分析-2阶段

    上文我们分析了fescar的一阶段执行过程.在一阶段中,服务起始方发起全局事务并注册到TC.在调用协同服务时,协同服务的事务分支事务会先完成阶段一的事务提交或回滚,并生成事务回滚的undo_log日志 ...

  9. vue的父子组件间的相互传参props及props数据的多种验证机制

    感觉自己即将完全步入前端大军,后台老板都不需要我弄了,塞翁失马...时间会告诉我们是好是坏 好了言归正传,最近vue是搞的不亦乐乎啊,下面来总结一下vue组件间的各种使用方法以及一些技巧 ------ ...

  10. [Vue] vue2.0

    vue实例 所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 当一个 Vue 实例被创建时,它将 data 对象中的所有的属性加入到 Vue 的响应式系统中.当这些属性的值发生改变时,视 ...