一直以来都没有详细计算过卷积输出大小的过程,都是需要的时候上网查,网上的教程都比较乱或者直接给出公式,不够形象,因此自己记录一下。
考虑上图的通用卷积场景:输入大小为9×9,卷积核大小为3×3,空洞因子(dilation rate)为3,卷积滑动步长为1,padding也为1。
首先,计算实际感受野的大小。考虑空洞卷积的情况下,实际上我们得在卷积核内隔一个像素插入一个空洞,即插入kernel_size−1个空洞,每个空洞大小为dilation−1,因此实际感受野为,
Filed=kernel_size+(kernel_size−1)(dilation−1)
有人会进一步化简为,
Filed=dilation×(kernel_size−1)+1
我还是习惯用最原始、最直观的计算公式来理解,
然后,我们回到上图,卷积是滑窗操作,不考虑第一个卷积计算,实际可滑动的距离d为多少?显然,就是图像大小加上padding后减去感受野的大小,即
d=width+2×pad−(kernel_size+(kernel_size−1)(dilation−1))
那么,输出的特征图大小不就是滑动距离除以步长再加上第一个卷积计算嘛,那么输出大小为,
output_w=(width+2×pad−(kernel_size+(kernel_size−1)(dilation−1)))/stride_w+1
一般来说,在卷积中,输入和卷积核都是正方形的,所以输出的高度计算公式也一样。另外,在代码实现的时候最好采用简化都是感受野计算公式,帮助减少点计算量,训练也会更快点嘛!