求逆卷积ConvTranspose2d(fractionally-strided convolutions)

本文详细介绍了逆卷积(ConvTranspose2d)的算法实现,通过三步完成:特征图变换、卷积核调整及常规卷积。首先,通过插值对输入特征图进行变换;其次,调整卷积核的步长和填充;最后,使用新的卷积核在新特征图上进行卷积得到逆卷积结果。逆卷积在深度学习中常用于上采样和生成网络。
摘要由CSDN通过智能技术生成

怎么求逆卷积ConvTranspose2d(fractionally-strided convolutions)?

这里并不给出理论推导,直接说算法实现。也就是代码中如何实现。

当给一个特征图a, 以及给定的卷积核设置,我们分为三步进行逆卷积操作:
  1. 第一步:对输入的特征图a进行一些变换,得到新的特征图a’
  2. 第二步:求新的卷积核设置,得到新的卷积核设置,后面都会用右上角加撇点的方式区分
  3. 第三步:用新的卷积核在新的特征图上做常规的卷积,得到的结果就是逆卷积的结果,就是我们要求的结果。

以下解释怎么做:
在说怎么做之前,我们下规定一下符号,右上角加撇点的为修改之后的:
特征图a: Height, Width
输入的卷积核: kernel 的size = Size, 步长为Stride,填充就是padding。

新的特征图:Height’=Height+(Stride-1)*(Height-1),Width类似计算得到。
接下来说一下这个新的特征图是怎么得到的:我们在输入的特征图基础加上一些东西,专业名词叫做interpolation,也就是插值。
这就涉及到两个问题,插在哪里,插什么。
插什么?插得就是0。
插在哪里?在原先高度方向的每两个相邻中间插上"Stride−1"列0。我们知道对于输入为Height的特征图来说有Height−1个位置,所以,最终我们的特征图在原先的基础上加上(Stride−1)∗(Height−1)

新的卷积核:Stride′ =1,这个数不变,无论你输入是什么。kernel的size′ 也不变, padding′ 为Size−padding−1.

最后,用新的卷积核和新的特征图,得到最终的逆卷积结果。
根据公式可以知道输出的特征图(用输入的符号表示)的大小是多少了,下面我给出简单的推导。

先给出公式【卷积输出计算公式】:

Height'_out= (Height'_in+ 2*padding -Size)/Stride+1

代上上面新的卷积核和新的特征图设置情况,可以得到

(Height+(Stride−1)∗(Height−1)+2∗(Size−padding−1)−Size)/1+1

化简可得:

(Height−1)∗Stride−2∗padding+Size

得到结果与pytorch官网给出的计算方法是一样的。目前这里先忽略output_padding。

参考原文链接:https://blog.csdn.net/qq_27261889/article/details/86304061

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值