CV/DL基础知识 之 反卷积参数推导
- 1,卷积参数表达式:
- 2,反卷积的运算过程:
- 3,反卷积参数的推导
- 4,后记
1,卷积参数表达式:
输入size :in
输出size :out
卷积核size:k
步长 :s
padding : p
out = [ (in - k + 2p)/s ] + 1 (1)
其中“ [] ”表示向下取整
那么:
in = ( out - 1 )*s + k - 2p + x (2)
其中 x = (in - k + 2p)%s,是公式(1)向下取整时丢掉的部分,%求余
2,反卷积的运算过程:
反卷积的作用是: 恢复某个卷积(k, p, s)造成的特征图size变化(下降)。
反卷积的参数和卷积的参数在数量和作用上基本一致,因为卷积和反卷积本质上是同一个操作(这一点后面会详细说明)
相应的,我们使用下列符号标记:
输入size :din
输出size :dout
卷积核size:dk
步长 :ds
padding : dp
除此之外,反卷积还有一个output_padding参数,我们用dpout表示
反卷积的计算过程等价于:
1,首先根据ds,对输入特征图进行填充。填充的方式是在输入特征图的相邻两个元素之间填充(ds-1)个0,如图1(a->b)所示(假设ds=2)。填充后特征图size为:(din-1) * ds + 1
2,对1的结果使用(dk-dp-1)进行padding(和卷积操作中的padding一致),如图1(b->c)所示(假设dp=1,dk=3) , padding后的特征图size为:(din-1) * ds + 1 + 2 * (dk-dp-1)
3,对2的结果使用dpout进行output_padding,即在特征图的上方和右侧各填充dpout个元素。注意output_padding与padding不同,仅在特征图的一侧进行填充,如图1(c->d)所示(假设dpout=1)。如果你细心的话,看到这里你应该发现,dpout和其他反卷积参数一样,也在卷积操作中有对应的参数,只不过是个隐参数,没错,就是x。output_padding后特征图size为:(din-1) * ds + 1 + 2*(dk-dp-1) + dpout
4,在3的结果上进行**【步长为1,卷积核为dk,padding为0】的卷积操作**,得到的结果就是反卷积的结果了,那么,反卷积输出的size为: [(din-1) * ds + 1 + 2*(dk-dp-1) + dpout - dk ] / 1 + 1 = (din-1) * ds + dk - 2 * dp + dpout
3,反卷积参数的推导
如前所述,我们使用反卷积的目的是:恢复某个卷积(k, p, s)造成的特征图size变化(下降)。
即,反卷积的输入din = out,我们希望找到合适的参数[dk, ds, dp, dpout],使得反卷积的输出dout=in
将其带入公式(2),有:
dout = ( din - 1 )*s + k - 2p + x (3)
通过 2中对反卷积计算过程的讨论,我们知道有:
dout = (din-1) * ds + dk - 2 * dp + dpout (4)
联立(3)(4),消去dout:
( din - 1 )*s + k - 2p + x = (din-1) * ds + dk - 2 * dp + dpout (5)
通过公式(5)我们可以选定合适的[dk, ds, dp, dpout],当然,可能的组合有很多种
一般在实际应用中,我们使用ds = s,你可以通过我们在第2部分讨论的ds的作用思考为什么这么做。
我们也经常使用dk = k
那么就有:
– 2 * dp + dpout = - 2 * p + x (6)
一般来说,选择dp = p, dpout = x,不过,正如我们在第2部分关于dpout的讨论,它填充到特征图一侧的,而(dk-dp-1)是填充到特征图两侧的,所以我更倾向于建议选择尽可能小的dpout。
值得注意的是,上面的推导是我们想构造一个针对某特定卷积(k, p, s)的反卷积的参数计算方法。
很多时候,我们只考虑将某个输入din上采样为dout,即不关心特征图从in=dout下采样到out=din的方式是怎样的(即不关心用一个还是多个卷积层还是池化进行的下采样)。
这时候,我们可以直接使用公式(4)计算反卷积的参数,当然,这有很多种参数组合
或者,更一般的,我们这样做:
假设in=dout下采样到out=din是通过一个卷积层完成的,推测这个卷积层应该有的参数k, s, p,然后按照前述方法计算反卷积参数。
4,后记
有一点不明白的地方是,为什么反卷积使用(dk-dp-1)进行padding,直接使用dp进行padding,即定义dp的含义为padding的size不是更直观吗?