怎么求逆卷积ConvTranspose2d(fractionally-strided convolutions)?
这里并不给出理论推导,直接说算法实现。也就是代码中如何实现。
当给一个特征图a, 以及给定的卷积核设置,我们分为三步进行逆卷积操作:
- 第一步:对输入的特征图a进行一些变换,得到新的特征图a’
- 第二步:求新的卷积核设置,得到新的卷积核设置,后面都会用右上角加撇点的方式区分
- 第三步:用新的卷积核在新的特征图上做常规的卷积,得到的结果就是逆卷积的结果,就是我们要求的结果。
以下解释怎么做:
在说怎么做之前,我们下规定一下符号,右上角加撇点的为修改之后的:
特征图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