1.结论
在用tf.nn.conv2d()
计算卷积的时候突然有一个疑问,当padding=SAME的时候Tensorflow
内部到底是这么处理的。网上找了一圈没发现,都是说怎么计算卷积后的尺寸,没办法挨个试了一遍总结了padding的规律。下面先说结论,再说示例。
符号及术语说明:
[]
表示取整,如[0.6]=0
;
⌈⌉
表示向上取整,如⌈0.6⌉=1
Tensorflow
中padding后尺寸的计算公式为:
1.当padding = 'VALID'
时
h
e
i
g
h
t
=
w
d
i
t
h
=
⌈
W
−
F
+
1
S
⌉
height=wdith=\large{\lceil}\frac{W-F+1}{S}\large\rceil
height=wdith=⌈SW−F+1⌉
2.当padding = 'SAME'
时
h
e
i
g
h
t
=
w
d
i
t
h
=
⌈
W
S
⌉
height=wdith=\large{\lceil}\frac{W}{S}\large\rceil
height=wdith=⌈SW⌉
其中W表示输入的长宽,F表示过滤器的尺寸,s表示步长
结论:
设输入形状为
W
×
W
W\times W
W×W,卷积核形状为
F
×
F
F\times F
F×F,步长为
S
S
S;则我们可以算出卷积或者池化后的尺寸为
w
=
⌈
W
S
⌉
w=\large{\lceil}\frac{W}{S}\large\rceil
w=⌈SW⌉,则padding的圈数为:
P
=
1
2
(
(
w
−
1
)
×
s
+
F
−
W
)
P=\frac{1}{2}((w-1)\times s+F-W)
P=21((w−1)×s+F−W)
以上公式是根据 w = [ W + 2 ∗ P − F S ] + 1 w = [\frac{W+2*P-F}{S}]+1 w=[SW+2∗P−F]+1得出
举个例子:
假如输入为 7 × 7 7\times7 7×7,卷积为 3 × 3 3\times3 3×3, S = 2 S=2 S=2;则卷积后的形状为 4 × 4 4\times4 4×4,那么padding的圈数为 1 2 ( ( 4 − 1 ) × 2 + 3 − 7 ) = 1 \frac{1}{2}((4-1)\times2+3-7)=1 21((4−1)×2+3−7)=1
假如输入为 8 × 8 8\times8 8×8,卷积为 3 × 3 3\times3 3×3, S = 2 S=2 S=2;则卷积后的形状为 4 × 4 4\times4 4×4,那么padding的圈数为 1 2 ( ( 4 − 1 ) × 2 + 3 − 8 ) = 0.5 \frac{1}{2}((4-1)\times2+3-8)=0.5 21((4−1)×2+3−8)=0.5
2.示例
下图均是根据Tensorflow
的计算结果画出的,7x7,3*3,1 分别是输入大小,过滤器大小,步长
P = 1 2 ( ( 7 − 1 ) × 1 + 6 − 7 ) = 2.5 P=\frac{1}{2}((7-1)\times 1+6-7)=2.5 P=21((7−1)×1+6−7)=2.5
P = 1 2 ( ( 4 − 1 ) × 2 + 3 − 8 ) = 0.5 P=\frac{1}{2}((4-1)\times 2+3-8)=0.5 P=21((4−1)×2+3−8)=0.5
注:当P包含0.5圈是,TensorFlow
中都是在右下角填充
更多内容欢迎扫码关注公众号月来客栈!