1. 卷积
输出:
o
u
t
_
s
i
z
e
=
i
n
_
s
i
z
e
+
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
out\_size = \frac{in\_size+2\times padding - kernel\_size}{stride} + 1
out_size=stridein_size+2×padding−kernel_size+1
如果想让输入和输出大小一样,则stride
必须为1,并且:
p
a
d
d
i
n
g
=
k
e
r
n
e
l
_
s
i
z
e
−
1
2
padding = \frac{kernel\_size-1}{2}
padding=2kernel_size−1
因此kernel
应该为奇数。
比较常用的组合为: kernel_size=3, padding=1, stride=1
和kernel_size=5, padding=2, stride=1
。
如果想让输出为输入的一半,则: stride=2
且
p
a
d
d
i
n
g
=
k
e
r
n
e
l
−
1
2
padding= \frac{kernel-1}{2}
padding=2kernel−1
常用组合为:stride=2, kernel=3, padding=1
。注意如果出现除不尽的情况,则一律向下取整。
对于pooling,计算和conv一样。不过pooling没有padding,因此:
o
u
t
_
s
i
z
e
=
i
n
_
s
i
z
e
−
k
e
r
n
e
l
s
t
r
i
d
e
+
1
out\_size = \frac{in\_size-kernel}{stride}+1
out_size=stridein_size−kernel+1
2. 反卷积
转置卷积的计算公式为:
o
u
t
_
s
i
z
e
=
s
t
r
i
d
e
×
(
i
n
_
s
i
z
e
−
1
)
+
k
e
r
n
e
l
out\_size = stride\times (in\_size-1)+kernel
out_size=stride×(in_size−1)+kernel
转置卷积中的padding
作用于卷积正好相反,是将最外层的去掉一圈,所以带有padding
的反卷积输出为:
o u t _ s i z e = s t r i d e × ( i n _ s i z e − 1 ) × + k e r n e l − 2 × p a d d i n g out\_size = stride\times (in\_size-1)\times + kernel - 2\times padding out_size=stride×(in_size−1)×+kernel−2×padding
如果要像conv
那样在外围加0的话,pytorch
中可以使用output_padding
参数。
实现2倍上采样,需要: stride=2, kernel_size=2*padding+2
。
常用组合为:stride=2, kernel=2, padding=0
、stride=2, kernel_size=4, padding=1
, 这样能实现2倍上采样:
o
u
t
_
s
i
z
e
=
2
⋅
(
i
n
_
s
i
z
e
−
1
)
+
2
−
2
⋅
0
=
2
⋅
i
n
_
s
i
z
e
\begin{aligned} out\_size &= 2\cdot (in\_size-1)+2-2\cdot 0 \\ &= 2\cdot in\_size \end{aligned}
out_size=2⋅(in_size−1)+2−2⋅0=2⋅in_size
3. 卷积中的dilation
dilation又称为 atrous convolutions
,即在卷积核的相邻元素之间增加spacing。dilation_rate
由参数d
控制,通常添加d-1
个空格进入kernel中。d=1
时表示普通的卷积操作。
dilated conv可以在不增加卷积核大小的情况下增大感受野,同时不增加额外开销,在多个扩张卷积逐次堆叠的情况下尤其有效。
dilated conv有效卷积核大小为:
k
^
=
k
+
(
k
−
1
)
(
d
−
1
)
\hat k = k + (k − 1)(d − 1)
k^=k+(k−1)(d−1)
因此dilated conv的输出大小为:
o s i z e = i n s i z e + 2 ⋅ p a d d i n g − k ^ s t r i d e + 1 = i n s i z e + 2 ⋅ p a d d i n g − k − ( k + 1 ) ⋅ ( d − 1 ) s t r i d e + 1 \begin{aligned} o_size =& \frac{in_{size} + 2\cdot padding - \hat k}{stride} + 1 \\ =& \frac{in_{size} + 2\cdot padding - k - (k+1)\cdot (d-1)}{stride} + 1 \end{aligned} osize==strideinsize+2⋅padding−k^+1strideinsize+2⋅padding−k−(k+1)⋅(d−1)+1
举例如下: