转置卷积也称为反卷积。对普通卷积,假设特征图是 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_size−1个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_size−1)∗(y.h−1)(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_size−padding−1,
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=stride′y.h′+2∗padding′−kernel_size′+1=(y.h−1)∗stride−2∗padding+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+2∗padding−kernel_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.hout−1)∗stride−2∗padding+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+2∗padding−kernel_size)%stride=p(5)
显然
p
<
s
t
r
i
d
e
p<stride
p<stride,那么我们实际上是相当于在一个高度为
y
.
h
−
p
\mathbf{y}.h-p
y.h−p的图片上做卷积,反过来,我们做转置卷积得到的高度也是
y
.
h
−
p
\mathbf{y}.h-p
y.h−p,比原始图片矮了
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就能解决问题。