CNN中感受野、feature map、参数量、计算量相关知识和计算方法
感受野的定义:
感受野的作用:
- 小卷积可以代替大卷积层
- 密集预测task要求输出像素的感受野足够的大,确保做出决策时没有忽略重要信息,一般也是越深越好
- 一般task要求感受野越大越好,如图像分类中最后卷积层的感受野要大于输入图像,网络深度越深感受野越大性能越好
- 目标检测task中设置anchor要严格对应感受野,anchor太大或偏离感受野都会严重影响检测性能
感受野的计算方法:
注意:
- 第一层感受野的大小等于滤波器的大小
- 感受野的大小和它之前所有层的滤波器大小和步长有关
- padding不影响感受野的大小,不考虑padding
从前往后计算,公式如下
RFl+1=RFl+(kernel_sizel+1−1)×feature_stridel
其中
feature_stridel用如下公式计算,默认
RF0=1,feature_stride0=1。
feature_stridel=i=1∏lstridei
如果是dilated conv,计算公式为
RFl+1=RFl+(kernel_sizel+1−1)×feature_stridel×dilationl+1
假如输入图片的大小为200*200, 经过一层卷积(kernel size 5 * 5, padding 1, stride 2),pooling(kernel size 3 * 3, padding 0, stride = 1),又一层卷积(kernel size 3 * 3, padding 1, stride 1)之后,请问输出特征图感受野的大小是多少?
conv1 = 1 + (5-1)*1 = 5,
RF0=5,feature_stride1=2
pooling = 5 + (3-1)*2 = 9,
RF1=9,feature_stride1=2
conv2 = 9 + (3-1)*2 = 13
RF2=13
所以最终感受野的输出大小为13
另一种方法是从top往下层迭代直到追溯到input image,计算公式如下:
(N−1)RF=f(NRF,stride,kernel)=(NRF−1)∗stride+kernel
其中
NRF 指的是第n层的 feature 在n-1层的RF,默认
NRF=1,
stride,kernel分别表示当前层的步长和滤波器大小
当包含dilated conv卷积时,需要重新计算滤波器的大小
d_kernel=(dilation−1)×(kernel−1)+kernel,所以计算公式变为:
(N−1)RF=f(NRF,stride,kernel)=(NRF−1)∗stride+d_kerneld_kernel=(dilation−1)×(kernel−1)+kernel
同样的以上面的例子举例:
2RF = (1-1)*1 + 3 = 3
1RF = (3-1)*1 + 3 = 5
0RF = (5-1)*2 + 5 = 13
feature map特征图的计算:
Hout=⌊Hin+2×padding[0]−dilation[0]×(kernelsize[0]−1)−1stride[0]+1⌋Wout=⌊Win+2×padding[1]−dilation[1]×(kernelsize[1]−1)−1stride[1]+1⌋
当有小数时,卷积操作:向上取整还是向下取整,根据框架而定,如tensorflow采用的是向上取整,pytorch采用的是向下取整;
pooling是统一向上取整;
CNN 模型所需的计算力(flops)和参数(parameters)数量的计算
对于一个卷积层,假设一个图像的输入通道为
nin,输出通道为
nout,kernel_size 为
kw×kh,输出的feature map尺寸为
fw×fh ,则该卷积层的
- paras =
nout×(kw×kh×nin+1)
- flops=
fw×fh×nout×(kw×kh×nin+1)
乘累加操作
MADD =
fw×fh×nout×(kw×kh×nin+1) +
fw×fh×nout×((kw×kh×nin−1)+1)
即 MADD = flops +
fw×fh×nout×((kw×kh×nin−1)+1)
深度可分离卷积
- paras =
nin×kw×kh+nout×(nin×1×1+1)
- flops =
fw×fh×nin×kw×kh+(nin×1×1+1)×nout×fw×fh