注:仅供自己学习记录
轻量化网络
从2015年开始机器的图片分类准确率超过人眼,随着逐渐发展到了2017年准确率已经很厉害,所以轻量化网络开始被关注
轻量化网络是需要部署在一些硬件设备上的模型,他不仅需要考虑识别的准确率,还要考虑搭载设备的计算量和内存等,所以要尽可能的缩减网络所需要的的计算量和参数量。例如无人驾驶、机器人、安防摄像头等本地边缘实时计算
边缘计算是部署在本地,不需要实现连接云服务器的设备,设备在本地就要进行计算和得出结果,不需要网络延迟、网络传输,也可以做到保护个人隐私。同时边缘终端设备的计算力很弱,需要做到端云协同
根据贾扬清的博士论文可以看到,神经网络在训练和运行时,GPU和CPU被占用最多的是卷积层的运算
而且卷积层的运算量和时间是随着Batch Size的增大变的越来越大(全连接层的计算量后期被全局平均池化代替)
计算机的能耗去了哪里?
从下图表中我们可以看到,加法的能耗最少,乘法的能耗是加法的4-5倍,读取内存的能耗最高,是前面两种操作的几百倍
图中也有读取内存的步骤,过度读取会导致能量消耗,浪费电能是一方面,另一方面会导致芯片的散热,所以要减少能耗
节省能耗可以通过减少参数量、调整结构(让结构更规则)等方式来实现
轻量化网络可以分为四个方面进行学习
从参数量、计算量、内存访问量、耗时、能耗、碳排放、CUDA加速、对抗学习角度分析
1)压缩已训练好的模型:知识蒸馏、权值量化、剪枝(权重剪枝和通道剪枝)、注意力迁移
2)直接训练轻量化网络:SqueezeNet、MobileNetV1、V2、V3、ShuffleNet、Xception、EfficientNet、NasNet、DARTS
3)加速卷积运算:im2col+GEMM、Winograd、低秩分解
4)硬件部署:TensorRT、Jetson、Tensorflow-slim、Tensorflow-lite、Openvino
轻量化网络在任何一个研究领域都可以发挥自己相应的左右,例如NLP、计算机视觉、对抗学习等
现有模型的精度、计算量和参数量展示
图中可以看到不同模型结构的不同指标,图像中左上角的模型相对精度和参数量更小
不同模型的参数量效率:单位参数量对最终性能准确率的贡献
不同batch_size的计算时间
Depthwise separable convolution (深度可分离卷积)
常规卷积
卷积的过程
使用128个卷积核扫描输入,再将扫描结果叠加起来,作为下一层的输入,那么下一层卷积核的通道数就要是128
使用相同通道数的卷积核扫描,进行逐个元素的相乘求和,放在后面的输出
深度可分离卷积
之前的卷积是一次卷积包含三通道或者多通道,深度可分离卷积是每个卷积核负责各自的通道,之后再将每个卷积核生成的feature map融合在一起
之后再使用1x1卷积对融合后的特征图扫描,这样可以进行跨层(通道)的融合
综上可知,深度可分离卷积是先进性depth_wise(深度卷积),在进行point_wise(逐点卷积)
先关注长宽方向的信息,后面只关注跨通道的信息
MobileNetV1原文的图
类似结构的Xception将两种卷积过程颠倒
注:本质上二者的顺序对模型影响不大
而且深度可分离卷积也可以看作是Group卷积的“及至版本”,Group卷积是每个Group负责一部分通道的卷积计算,而深度可分离改进到到了每个通道都有一个卷积负责
同样思想的卷积核拆分还出现在InceptionV3中,使用的空间可分离卷积,但是没有起到轻便的作用
深度可分离卷积参数量和计算量分析
传统卷积一次的乘法计算量和参数量
深度可分离卷积
网络中还有两个控制网络大小的参数
二者参数量相比较可以得出,如果都使用常见的3x3,深度可分离网络的参数量和计算量是传统卷积的1/9
MobileNet
MobileNetV1网络结构
MobileNetV1性能分析
大部分计算集中在1x1卷积中,计算核心就是加速1x1卷积
怎样加速1x1卷积?
1x1卷积的作用:
1)卷积核数量大于扫描数据通道数,升维度
2)卷积核数量小于扫描数据通道数,降维度
加速1x1卷积运算我们可以将卷积运算变成矩阵运算,现有的科学计算法已经可以高效的运行计算
关键点是:Im2col和高效GEMM(后面进行详细介绍)
加速的过程如下:
1-分多次将卷积结果变成列
2-将卷积运算变成矩阵运算,使用GEMM加速
1x1卷积的优势是它本身就是一个向量,不需要进行Im2col,直接可以使用矩阵乘法
MobileNet的性能
作者和许多经典网络性能进行对比,可以看出MobileNet的参数量大大减小且精度影响不大
准确率和计算量二者之间的关系,会在精度达到一个界限时参数量猛增,再提升精度需要消耗更多能量
在目标检测、人脸识别、以图搜地等领域有较好效果
代码实现
用代码实现论文中的两种卷积结构,传统卷积和深度可分离卷积
基于keras框架的代码(部分)
Im2col(image to column 为了加速卷积)
矩阵乘法运算可以被高度优化加速,有很多现成算法和工具包
将卷积运算变成矩阵乘法
将感受野(立方体)拉成一列,后面多个卷积核的感受野同样进行这样的操作
因为不同感受野之间有重叠,不同感受野(列)很多元素重复,占用大量内存
将卷积核拉成行
然后将行和列相乘,就可以得到拉伸数据和拉伸卷积核扫描的结果,在进行Reshape变成需要的形状
整个流程图
变成数字计算
三通道示意图,三通道矩阵图需要分别进行拉伸,对应的卷积也同样要进行拉伸
将拉伸卷积核与拉伸图像进行矩阵运算,再根据需求进行Reshape
三通道
也可以将卷积核拉成列,数据拉成行
caffe代码怎样进行计算
知乎上caffe的作者亲自回答了该问题:在 Caffe 中如何计算卷积? - 知乎