在卷积神经网络:二维卷积层中说到,如果输入
X
X
X的形状为
(
h
x
,
w
x
)
(h_x,w_x)
(hx,wx),卷积核
K
K
K的形状为
(
h
k
,
w
k
)
(h_k,w_k)
(hk,wk),那么输出
Y
Y
Y(特征图feature map)的形状为:
{
h
y
=
h
x
−
h
k
+
1
w
y
=
w
x
−
w
k
+
1
\begin{cases} h_y=h_x-h_k+1 \\ w_y=w_x-w_k+1 \end{cases}
{hy=hx−hk+1wy=wx−wk+1
即卷积层的输出形状由输入形状、卷积核窗口形状决定。这篇文章将记录学习卷积层的两个超参数(即需要自己调整的参数):填充、步幅。它们可以对于给定形状的输入和卷积核改变输出形状。
一、填充(padding)
填充是指在输入的高、宽两侧填充元素(通常为0),如下图:
虚线框部分即为填充的0。增加了
p
a
d
d
i
n
g
padding
padding的输入,卷积层输出的形状也会相应的改变。假设在高的两侧共填充
h
p
h_p
hp行,宽的两侧共填充
w
p
w_p
wp列,那么相应的输出形状变为:
{
h
y
=
h
x
+
h
p
−
h
k
+
1
w
y
=
w
x
+
w
p
−
w
k
+
1
\begin{cases} h_y=h_x+h_p-h_k+1 \\ w_y=w_x+w_p-w_k+1 \end{cases}
{hy=hx+hp−hk+1wy=wx+wp−wk+1
由这个公式,可以得出:
- 我们可以设置 p a d d i n g padding padding的形状为 ( h k − 1 , w k − 1 ) (h_k-1,w_k-1) (hk−1,wk−1),使得输出形状与输入性状相同。这也是经常的做法
- 在上述做法中,如果 h k h_k hk为奇数,则上下两端的 p a d d i n g padding padding高度相同;如果 h k h_k hk为偶数,则上下两端的 p a d d i n g padding padding高度不同。对于宽度也是如此。所以一般来说,卷积核的高宽均为奇数
二、步幅(stride)
卷积神经网络:二维卷积层中说到,卷积核窗口会在输入上滑动。每次滑动的行数、列数称之为步幅。下图中,高上步幅为3,宽上步幅为2。
加入了步幅之后,输出的形状又会变化。假设高上步幅为
h
s
h_s
hs,宽上步幅为
w
s
w_s
ws,则输出形状为:
{
h
y
=
h
x
+
h
p
−
h
k
h
s
+
1
w
y
=
w
x
+
w
p
−
w
k
w
s
+
1
\begin{cases} h_y=\frac {h_x+h_p-h_k}{h_s} + 1\\ w_y=\frac {w_x+w_p-w_k}{w_s} + 1 \end{cases}
{hy=hshx+hp−hk+1wy=wswx+wp−wk+1
当 h p = h k − 1 , w p = w k − 1 h_p=h_k-1,w_p=w_k-1 hp=hk−1,wp=wk−1时(即输入和输出形状相同),我们再设置步幅 s t r i d e stride stride时,输出的形状会缩小 s t r i d e . s h a p e stride.shape stride.shape倍(高、宽均缩小)。
三、小结
- p a d d i n g padding padding可以增加输出的高、宽,通常用来使:输入和输出形状相同
- s t r i d e stride stride可以减小输出的高、宽