0 参数和FLOPs计算
FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度
卷积层的参数量计算
(K imes K imes C_i imes C_o)
卷积层的FLOPs计算:
((2 imes C_i imes K imes K - 1) imes C_o imes H imes W)
- (C_i=input channel, k=kernel size, HW=output feature map size, C_o=output channel)
- 2是因为一个MAC算2个operations。
- 不考虑bias时有-1,有bias时没有-1。
FLOPs与图像的大小有关系,而参数量和图像大小没关系。
代码https://github.com/sovrasov/flops-counter.pytorch
1 卷积设置
- Kernel size 卷积核尺寸
- Padding 边缘补值
- Stride 卷积步长
- Dilation 膨胀
1.1 计算公式
(H_{out} = [frac{H_{in} + 2 imes padding - dilation imes (kernel\_size -1) -1}{stride} + 1])
我们遵循Pytorch中关于卷积设置的定义,padding的数值是指在特征图的上下左右都进行补值,dilation是指卷积核除去第一列(行)之后的每一列(行)的膨胀倍数。
公式中的 (dilation imes (kernel\_size -1) +1) 其实计算的就是dilation之后的kernel size.
当无法整除时,向下取整。
假设输入特征图尺寸128*128,
- kernel size=3*3,padding=0,stride=1,dilation=1,输出特征图尺寸 (128-3)/1 + 1 =126
- kernel size=3*3,padding=1,stride=1,dilation=1,输出特征图尺寸 (128+2-3)/1 + 1 =128
- kernel size=3*3,padding=0,stride=2,dilation=1,输出特征图尺寸 (128-3)/2 + 1 =63
- kernel size=3*3,padding=0,stride=1,dilation=2,输出特征图尺寸 (128-5)/1 + 1 =124
- kernel size=3*3,padding=1,stride=2,dilation=1,输出特征图尺寸 (128+2-3)/2 + 1 =64
2 常规卷积
- 输入特征图尺寸:(C*H*W)
- 卷积核尺寸:(C*K*K),该层有N个卷积核
- 参数量:(N*C*K*K)
- 特征图尺寸:(N*H'*W')
特点就是卷积核的通道数应该等于输入特征图的通道数,卷积核的个数等于输出特征图的通道数。
3 Group Convolution 分组卷积
Group Convolution顾名思义,则是对输入feature map进行分组,然后每组分别卷积。
假设输入feature map的尺寸仍为 (C*H*W) ,输出feature map的通道数为N,如果设定要分成G个groups,则每组的输入feature map的通道数为 (frac{C}{G}),每组的输出feature map通道数为 (frac{N}{G}),每个卷积核的尺寸为 (frac{C}{G}*K*K),卷积核的总数仍为N个,每组的卷积核数量为 (frac{N}{G}),卷积核只与其同组的输入map进行卷积,卷积核的总参数量为 (N*frac{C}{G}*K*K),可见,总参数量减少为原来的 (frac{1}{G}).
4 Depthwise Convolution
在分组卷积的基础上,当分组数量等于输入feature map的通道数,则输出feature map的通道数也等于输入feature map的通道数,即 (G=C=N),N个卷积核每个尺寸为 (1*K*K) 时,Group Convolution就成了Depthwise Convolution.
5 Global Depthwise Convolution
更进一步,如果分组数 (G=N=C),同时卷积核的尺寸与输入feature map的尺寸相同,即 (K=H=W),则输出feature map为 (C*1*1),即长度为C的向量,此时称之为Global Depthwise Convolution(GDC),可以看成是全局加权池化,与 Global Average Pooling(GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重,而GAP每个位置的权重相同,全局取个平均。
6 Pointwise Convolution
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 (C*1*1),C为输入特征图的通道数。所以这里的卷积运算会将上一步的特征图在深度方向上进行加权组合,生成新的feature map。同样,还是有几个卷积核就有几个输出feature map。
7 Depthwise Separable Convolution 深度可分离卷积
Depthwise Separable Convolution是将一个完整的卷积运算分解为两步进行,即Depthwise Convolution与Pointwise Convolution。
参考
https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d
https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
https://ezyang.github.io/convolution-visualizer/index.html
https://blog.csdn.net/tintinetmilou/article/details/81607721
https://www.cnblogs.com/shine-lee/p/10243114.html
https://www.zhihu.com/question/65305385