来自华为诺亚方舟实验室、北京邮电大学以及香港科技大学的研究者们提出了一个新的轻量模型范式TinyNet。相比于EfficientNet的复合放缩范式(compound scaling),通过TinyNet范式得到的模型在ImageNet上的精度要优于相似计算量(FLOPs)的EfficientNet模型。例如, TinyNet-A的Top1准确率为76.8% ,约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E的准确率达到59.9%,比之前体量相当的MobileNetV3高约1.9%。

注:上图部分来源于:https://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DmqOdIYxxNCs
转载自Mindspore首席架构师金雪锋:https://zhuanlan.zhihu.com/p/325923211
论文链接:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdf
https://https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdfhttps://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2010.14819.pdf0开源地址:https://link.zhihu.com/?target=https%3A//gitee.com/mindspore/mindspore/tree/master/model_zoo/research/cv/tinynet
简介
深度卷积神经网络(CNN)在许多视觉任务中取得了很大成功。然而,如果要在移动设备上部署AI模型,我们需要持续调整网络深度(模型层数)、宽度(卷积通道的数量)和图像分辨率这些网络结构要素来优化内存使用并减少延迟。EfficientNet在模型深度,宽度,图像分辨率这三个维度复合缩放来调整神经网络结构。然而EfficientNet更多关注在如何产生大体量的模型,轻量模型的设计有待更好的发掘。
一个直接的方法是应用EfficientNet的缩放公式。例如,我们可以进一步缩小EfficientNet-B0,并得到一个具有200M FLOPs的EfficientNet-B-1。然而这种策略无法得到最有效的模型。我们随机生成了100个通过改变基线模型EfficientNet-B0的三维(模型深度,宽度,图像分辨率)得到的网络模型。这些模型的计算量小于或等于基线模型(图1)。我们发现这其中最佳模型的精度比用EfficientNet缩放公式得到的模型高出约2.5%。

本文研究的是模型精度和三个维度(模型深度,宽度,图像分辨率)的关系并希望探索出比EfficientNet更优的模型压缩范式。首先,我们发现对于轻量模型,图像分辨率和模型深度比宽度更重要。然后我们指出,EfficientNet的复合放缩方法不再适合为移动设备设计轻量网络。因此,我们通过对于前沿模型(图1中的红线)的大量实验和观察探索了一个新的压缩模型的范式‘Tiny Formula’。具体来说,给定FLOPs上限,我们通过在前沿模型上进行高斯过程回归,并用‘Tiny Formula’计算最佳输入图像分辨率和模型深度。然后根据最大FLOPs的约束来确定模型的宽度。论文中所提出的‘Tiny Formula’简单有效:例如, TinyNet-A的Top1准确率为76.8% ,计算量约为339M FLOPs,而EfficientNet-B0类似性能需要约387M FLOPs。另外,仅24M FLOPs 的TinyNet-E在ImageNet上图像分类的准确率达到59.9%,比当前体量相当的MobileNetV3高约1.9%。该文章原创地研究了如何通过同时改变分辨率、深度和宽度来生成微小且有效的神经网络。
图像分辨率,模型深度和宽度对精度的影响

我们发现,高精度模型的输入图像分辨率大约在0.8到1.4之间。当r < 0.8时,分辨率越大,精度越高,而当r > 1.4时精度略微下降。在深度方面,高性能的模型深度从0.5到2不等。当固定计算量时,模型宽度与精度大致呈负相关。好模型主要分布在w < 1处。从图2中我们也发现EfficientNet-B-1精度只有75.8%,精度比相同计算量下的最佳模型要差很多。因此我们需要探索一种新的模型放缩公式,在计算量的约束下获得更好的模型。
探索最优Tiny Formula

为了寻找这样的函数,我们从[0.25,4]这个区间内对r, d, w进行随机采样,采样出n个参数组合。根据参数组合对基础模型的r, d, w进行改变,得到n个新模型,同时计算出n个新模型的计算量。我们根据计算量和精度,从这n个新模型中选出在帕累托前沿的m个模型(m <= n),这m个模型是我们需要的优秀模型,从而得到其r, d, w与计算量之间的关系。比如,我们得到三个关系如下所示:

我们使用高斯过程回归来拟合上述3张图的3个曲线。以分辨率r为例,图中的m个点的横纵坐标分别为计算量FLOPs

和分辨率

其他2个曲线公式也可以通过类似的方式得到。
得到了上述拟合曲线公式,用户只要输入想要的计算量c*,就可以得到预测的r*,d*,w*值。通过(r*,d*,w*)对基础模型EfficientNet的宽度、深度和输入分辨率进行改变,就可以得到计算量为c*的TinyNet模型。
实验结果
通过改变计算量系数c的值(c = {0.9, 0.5, 0.25, 0.13, 0.06})我们生成了5个轻量模型,TinyNet-A 到E。跟已有的方法相比,在同等计算量量的情况下,我们的方法能够得到性能更优的模型。其中,RA表示Random Augmentation, 一种自动数据增强的方法。



MindSpore 代码实现
相关训练与推理代码,以及使用方法已经开源在:
为了方便大家验证我们的结果,以及创新,我们将模型的结构,以及超参数的设置汇总到了相关代码仓的/script文件夹,我们同时提供了多卡分布式训练的启动脚本。参数设置以单卡训练脚本train_1p_gpu.sh为例:

如果想切换其他的TinyNet模型,只需在—model的位置将模型从tinynet_c更改即可。
相关模型结构定义在/src/tinynet.py中:

其中EfficientNet-B0为基线模型,它的输入图像分辨率,宽度和深度三维值为(1,1,1)。
TinyNet模型沿用了EfficientNet的模块化设计,其中又分为DepthwiseSeparableConv , InvertedResidual,SqueezeExcite,DropConnect,这些模块等。每一个模块都衍生自mindspore.nn.Cell。这些模块统一在GenEfficientNet中被调用,并依据用户给出的图像分辨率,宽度和深度三个数值生成神经网络。MindSpore的网络定义请参考:
https://www.mindspore.cn/tutorial/training/zh-CN/master/use/defining_the_network.html
数据集的加载定义在了/src/dataset.py中,主要使用了MindSpore强大的数据集加载和处理工具mindspore.dataset。具体使用方法大家可以参考:
https://www.mindspore.cn/tutorial/training/en/master/use/load_dataset_image.html
模型权重的指数移动平均(Exponential Moving Average),模型精度验证和训练数据的记录定义在了/src/callback.py。利用mindspore.train.callback模块,用户可以灵活地选择每一步训练或每一轮epochs后希望进行的操作,例如模型验证,Loss打印,模型保存,权重平均等。具体使用方法大家可以参考:
https://www.mindspore.cn/doc/api_python/zh-CN/master/mindspore/mindspore.train.html
最后,我们使用MindSpore Lite工具转换了模型权重,并测试了EfficientNet和TinyNet在华为P40上的推理时延。TinyNet-A比EfficientNet-B0的运行速度快15%,但其精度与EfficientNet-B0相似。TinyNet-E与EfficientNet-B-4相比,在同等时延下,精度提升3.2%。

端测模型转换,部署等请参考:
https://link.zhihu.com/?target=https%3A//www.mindspore.cn/lite
本文转自:https://zhuanlan.zhihu.com/p/326022740
