ConvTranspose2d用法

1.逆卷积ConvTranspose2d(fractionally-strided convolutions)

先说卷积:对于一个图片A,设定它的高度和宽度分别为Height,Width,通道数为Channels。 然后我们用卷积核(kernel * kernel)去做卷积,(这里设定卷积核为正方形,实际长方形也可以类推,相信我,不会很难),步长为stride(同样的,不区分高宽方向),做padding。卷积后得到B。

重复上面的话就是利用一个卷积操作将A变成B。

那么,在这个前提下,逆卷积就是将B变成A

那么怎么规定卷积核这些参数呢,这些又是什么意思?

对于卷积操作,我不多说了,这里不做解释。而且我们应该比较清楚如何从输入的图片大小格式等得到新的图片大小,或许有的人熟悉用特征图来代替图片。
对于逆卷积操作,卷积核的设置就是和卷积操作相同。如:给定一个特征图x,并输入卷积核设置。我们就是想得到一个特征图y经过输入的卷积核进行卷积,然后得到特征图x,这里我们要求的就是特征图y

写到这里大家应该比较理解我为什么把它翻译成逆卷积了吧。
如果不懂,也没事,可以看下面的例子。

举个例子:
卷积操作
上面这个是一个卷积操作。
我们输入的特征图为x: 4 x 4 x channels_in,channels_in表示通道数
卷积核设置:无padding, kernel size为3*3, 步长stride 为1,
输出的特征图为y:2 x 2 x channels_out,channels_out也是通道数。

逆卷积操作的输入就是特征图y, 卷积核设置同上。要求上面的特征图x。

这里先给出这个对应逆卷积的说明图。后面给出泛化的说明。

在这里插入图片描述

2.求逆卷积ConvTranspose2d(fractionally-strided convolutions)

代码中如何实现:

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

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

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

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

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

先给出公式:
Height_{out}=(Height_{in}+2*padding-kernel_{size})/strides+1
这里补充一句,padding的size只是针对一边的,所以要乘以2.

带上上面新的卷积核和新的特征图设置情况,可以得到
(Height+(Stride−1)∗(Height−1)+2∗(Size−padding−1)−Size)/1+1
化简可得:(Height−1)∗Stride−2∗padding+Size

上面这幅图就是pytorch官网给出的计算方法,和这里给出是一样的。当然这里先忽略output_padding是什么。

有兴趣可以算一下从这个是否满足反向计算的一致性。

最后,这里给一个例子参考,特别是怎么计算到新的特征图的,尤其是怎么插值(interpolation)。
在这里插入图片描述
对图的说明:
输入特征图A:3 ∗ 3
输入卷积核K:kernel为3 ∗ 3, stride为1, padding为1
新的特征图A’: 3+(3−1)∗(2−1)=3+2=5 注意加上padding之后才是7。
新的卷积核设置K’: kernel不变,stride为1,padding=3−1−1=1
最终结果:(5+2−3)/1+1=5

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值