关于转置卷积的一点理解

转置卷积也称为反卷积。对普通卷积,假设特征图是 x \mathbf{x} x,在给定 k e r n e l _ s i z e kernel\_size kernel_size p a d d i n g padding padding s t r i d e stride stride后卷积得到特征图 y \mathbf{y} y,那么转置卷积就是希望从 y \mathbf{y} y得到 x \mathbf{x} x,也就是找到一个 x \mathbf{x} x使它在给定的卷积参数设置下卷积后得到 y \mathbf{y} y,当然这里只要求形状上的相等。

转置卷积具体是这样实现的,首先将 y \mathbf{y} y每两个像素之间插入 k e r n e l _ s i z e − 1 kernel\_size-1 kernel_size1个0,这里以高度为例,那么
y . h ′ = y . h + ( k e r n e l _ s i z e − 1 ) ∗ ( y . h − 1 ) (1) \mathbf{y}.h'=\mathbf{y}.h+(kernel\_size-1)*(\mathbf{y}.h-1)\tag{1} y.h=y.h+(kernel_size1)(y.h1)(1)
之后以 s t r i d e ′ = 1 stride'=1 stride=1 p a d d i n g ′ = k e r n e l _ s i z e − p a d d i n g − 1 padding'=kernel\_size-padding-1 padding=kernel_sizepadding1 k e r n e l _ s i z e ′ = k e r n e l _ s i z e kernel\_size'=kernel\_size kernel_size=kernel_size进行卷积,可以验证,此时的输出为
y . h o u t = y . h ′ + 2 ∗ p a d d i n g ′ − k e r n e l _ s i z e ′ s t r i d e ′ + 1 = ( y . h − 1 ) ∗ s t r i d e − 2 ∗ p a d d i n g + k e r n e l _ s i z e (2) \begin{aligned} \mathbf{y}.h_{out}&=\frac{\mathbf{y}.h'+2*padding'-kernel\_size'}{stride'}+1\\ &=(\mathbf{y}.h-1)*stride-2*padding+kernel\_size \end{aligned}\tag{2} y.hout=stridey.h+2paddingkernel_size+1=(y.h1)stride2padding+kernel_size(2)
在普通卷积时
y . h o u t = y . h + 2 ∗ p a d d i n g − k e r n e l _ s i z e s t r i d e + 1 (3) \mathbf{y}.h_{out}=\frac{\mathbf{y}.h+2*padding-kernel\_size}{stride}+1\tag{3} y.hout=stridey.h+2paddingkernel_size+1(3)
那么反求出 y . h \mathbf{y}.h y.h,有
y . h = ( y . h o u t − 1 ) ∗ s t r i d e − 2 ∗ p a d d i n g + k e r n e l _ s i z e (4) \mathbf{y}.h=(\mathbf{y}.h_{out}-1)*stride-2*padding+kernel\_size\tag{4} y.h=(y.hout1)stride2padding+kernel_size(4)
这跟公式 ( 2 ) (2) (2)正好对应,即我们从 y \mathbf{y} y得到了 x \mathbf{x} x。但在实际操作时是这样的吗?

卷积时剩余的像素高度如果小于 s t r i d e stride stride,那么这些像素会被舍弃,也就是公式 ( 3 ) (3) (3)的的除法是向下取整,假设我们舍弃了高度为 p p p的像素 p > 0 p>0 p>0,即
( y . h + 2 ∗ p a d d i n g − k e r n e l _ s i z e ) % s t r i d e = p (5) (\mathbf{y}.h+2*padding-kernel\_size)\%stride=p\tag{5} (y.h+2paddingkernel_size)%stride=p(5)
显然 p < s t r i d e p<stride p<stride,那么我们实际上是相当于在一个高度为 y . h − p \mathbf{y}.h-p y.hp的图片上做卷积,反过来,我们做转置卷积得到的高度也是 y . h − p \mathbf{y}.h-p y.hp,比原始图片矮了 p p p个像素。

这个问题该怎么解决呢?这就需要用到 o u t p u t _ p a d d i n g output\_padding output_padding这个参数,它会在转置卷积得到的特征图上补充 o u t p u t _ p a d d i n g output\_padding output_padding层像素,因此令 o u t p u t _ p a d d i n g = p output\_padding=p output_padding=p就能解决问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值