卷积层输出形状的计算
不考虑步幅情况下的计算(步幅为1)
假设
输入:
X
m
∗
n
X_{m*n}
Xm∗n
核大小:
k
∗
l
k*l
k∗l
步幅为1,从高度(行)角度看,因为核向下移动一行在行上就会产生一个输出,核是有高度的,那么移动到最后,核的下端要和输入的下端对齐,那么核在最后占据一个核的高度,在核的上面还有 m − k m-k m−k个行,这些行上,核每移动一行都会产生一行输出,最后再加上核在行上的最后一个位置还会产生一个输出,那么在行上就产生 m − k + 1 m-k+1 m−k+1个输出
从宽度(列)的角度同理,将会产生 n − l + 1 n-l+1 n−l+1个输出
所以步幅为1的情况下将会产生 ( m − k + 1 ) ∗ ( n − l + 1 ) (m-k+1) * (n-l+1) (m−k+1)∗(n−l+1)个输出
考虑步幅情况下的计算
假设
输入:
X
m
∗
n
X_{m*n}
Xm∗n
核大小:
k
∗
l
k*l
k∗l
步幅:
S
r
(
行
)
S_r(行)
Sr(行) ,
S
c
(
列
)
S_c(列)
Sc(列)
与步幅为1思路相同,只不过这里步幅改变,从行来看,我们仍然在最后一个位置留下一个核的高度,那么还剩下 m − k m-k m−k行,然后在这一步我们需要注意与步幅为1不同的是:这里每移动一个行步幅才在行上产生一个输出,那么上面部分将会产生 ⌊ ( m − k ) / S r ⌋ \lfloor (m-k) / S_r \rfloor ⌊(m−k)/Sr⌋ 个输出,这里为什么要用向下去取整呢,因为当 m − k m-k m−k没办法被 S r S_r Sr整除时,剩下的显然没办法进行互相关运算,所以只能用向下取整。注意我们最后还有一个核的高度,所以还需要加上一个步幅,最终输出的行数为 ⌊ ( m − k + S r ) / S r ⌋ \lfloor (m-k+S_r) / S_r \rfloor ⌊(m−k+Sr)/Sr⌋
同理,在列(宽度)上最终输出就应该为 ⌊ ( n − l + S c ) / S c ⌋ \lfloor (n-l+S_c) / S_c \rfloor ⌊(n−l+Sc)/Sc⌋
所以在上述步幅情况下的卷积层输出应该为: ⌊ ( m − k + S r ) / S r ⌋ ∗ ⌊ ( n − l + S c ) / S c ⌋ \lfloor (m-k+S_r) / S_r \rfloor * \lfloor (n-l+S_c) / S_c \rfloor ⌊(m−k+Sr)/Sr⌋∗⌊(n−l+Sc)/Sc⌋
但是在步幅不为1的情况下用上面的方法理解是有bug的,因为移动是依次移动的,不是像理解那样直接在最后先预留一个核的位置,所以有剩的不能进行互相关运算的也应该留在最后,而不是 m − k m-k m−k的位置,此外此处并没有考虑填充。
总结
本人于学习过程中记录下自己的理解,如果对上述问题理解有误,请大家批评指正!