简介
目前的神经网络模型层出不穷,其中在图像识别的畛域不仅十分高效疾速,而且准确率也十分高。但咱们在进步准确率的路线上是永不止步的,比拟矛盾的是在进步准确率的同时也会带来耗费,须要更高的计算资源,这对模型的利用是很大的门槛。本次分享小 Mi 给大家介绍一个神经网络模型 Mobilenet_V2。该模型骨骼精奇,独特的网络结构设计能够缩小训练过程中的计算次数和对内存的占用,上面咱们一起探讨学习下。
MindSpore 深度学习框架中的 MobileNet_V2 能够联合硬件感知神经网络架构搜寻(NAS)和 NetAdapt 算法,移植到手机 CPU 上运行,不过本次仅从根底应用介绍,没有波及手机上运行,感兴趣的同学能够本人 Moilenet_V2 教程参考尝试下哦。
Mobilenet_V2 介绍
在缩小计算量和堆内存的占用方面,Mobilenet_V2 的结构设计次要有以下几点改良。
深度可拆散卷积(Depthwise Separable Convolutions):深度可拆散卷积块对进步网络结构的高效性是十分无效的,论文作者在 MobileNet_V2 模型中也应用了这种构造。简略的解释为:把原始的一层失常卷积分解成两层的卷积。合成后的两层第一层叫做 depthwise 卷积,它的 filter 的参数很少,是对输出的每一个 channel 进行独自的卷积运算。第二层是一个 1 ×1 的卷积,叫做 pointwise 卷积,能够扭转 channel 的个数,直观的结构设计如下图。
咱们再从从计算量上剖析。在惯例的卷积计算中,如果咱们输出是,卷积的 kernel 是,输入设定为,这样卷积过程中的计算量就是。如果咱们应用可拆散卷积的办法,须要的计算量就会是。假如咱们的卷积的 k =3,可拆散卷积的计算量要比一般卷积的计算量减少 80% 多,然而也会有些精度损失。
线性瓶颈(Linear Bottlenecks):这也是模型原作者提到的一点,能够了解为当 channel 的个数比拟少的时候,所有的信息就会集中在比拟窄的 channel 中,如果这个时候进行非线性激活就会造成很多信息的失落。而在 MobileNet V1 中引入的一个超参数 width multiplier 会缩减 channel,这样看起来就像一个瓶子的颈部一样。下图是作者一个直观的展现。
能够很显著的发现如果 channel 越小,输入与输出的差距越大,示意失落的信息越多,随着 channel 的逐步增大,失落的信息会越来越少。了解起来就是,假如当 channel 为 2 时,信息都会集中在这两个 channel 中,如果有局部数值小于 0 就会被 RELU 激活失落掉。而如果 channel 为 30,其实信息就绝对扩散一些,所以就算通过非线性函数 Relu 激活后归于 0 的值可能并不会影响太多信息的存储。
所以作者倡议是对于 channel 数很少的那些网络层做线性激活。bottlenect 就示意缩减的层,linear bottleneck 示意对 channel 缩减的网络层做线性函数激活。如果要用 Relu 激活须要先减少 channel 数再做 Relu 激活。而且原文中非线性激活函数应用 Relu6,Relu6=min(max(features, 0), 6),这个函数应该更实用于这个模型。
倒置残差(Inverted residuals):能够十分无效的解决线性瓶颈的问题。因为思考到如果 channel 比拟少的时候,tensor 的信息会特地集中,在应用非线性激活会造成信息的损失,应答的策略能够是对 channel 比拟少的 tensor 进行 channel 的扩张。而残差 block 是先进行 channel 缩减,而后扩张,这样可能会失落信息。作者就设计了一种倒置的残差 block,先进行 channel 扩张,而后进行 channel 缩减。如下图显示比照,虚线的 tensor 后进行线性激活,这种倒置残差 block 是作者对残差 block 提出的一个改良。具体构造如下图所示
而后再联合咱们下面说到的深度可拆散卷积,深度可拆散卷积 + 倒置残差的构造如下图所示
上图就是论文中展现的各种构造的比照,a 是一般卷积构造,b 是深度拆散卷积构造,c 是有 bottlenect 的拆散卷积,d 是对 bottlenect 进行扩张后的拆散卷积。图中所有虚线的 tensor 前面都是线性激活。d 的构造和导致残差构造就是有无 shorcut 连贯的差异,具体的计算如下图。
以上几点就是 MobileNet_V2 模型的要害翻新,同时附上残缺的计算图给大家参考
原文请见:https://arxiv.org/pdf/1801.04…
ImageNet 数据集介绍
ImageNet 数据是 CV 畛域十分闻名的数据集,ImageNet 图像数据集始于 2009 年,CVPR2009 上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文,之后就是基于 ImageNet 数据集的 7 届 ImageNet 挑战赛 (2010 年开始),2017 年后,ImageNet 由 Kaggle 持续保护。
ImageNet 是一项继续的钻研工作,目前 ImageNet 中总共有 14197122 幅图像,总共分为 21841 个类别 (synsets),也是目前世界上图像识别最大的数据库。ImageNet 领有用于分类、定位和检测工作评估的数据,与分类数据相似,定位工作有 1000 个类别。所有图像中至多有一个边框。对 200 个指标的检测问题有 470000 个图像,均匀每个图像有 1.1 个指标。
该数据集是公开的,所以咱们想要下载应用也比拟不便。下载页面如下图所示,能够通过此链接下载:http://www.image-net.org/down…
数据集大小:125G,共 1000 个类、1.2 万张彩 ** 像
训练集:120G,共 1.2 万张图像
测试集:5G,共 5 万张图像
数据格式:RGB
MindSpore 中的 MobileNet_V2
MindSpore 的仓库中有残缺的模型教程和脚本,具体的链接可见:https://gitee.com/mindspore/m…
有残缺的目录领导咱们进行配置训练,这里能够更粗疏的理解 MindSpore 框架对 MobileNet_V2 模型的实现,也能够学习到应用 MindSpore 训练的步骤办法办法和个性。
模型训练
以上内容咱们介绍了 Moilenet_V2 网络模型、ImageNet 数据集和 MindSpore 中的阐明应用。当初咱们依照教程中的步骤尝试下,这里应用的环境是 Windows 零碎 +1.5.0 版本的 MindSpore,因为是应用 CPU 硬件,所以也须要设置下参数,保障可能辨认出硬件环境。
if config.platform == “CPU”:
context.set_context(mode=context.GRAPH_MODE, device_target=config.platform, \
save_graphs=False)
MindSpore 提供了残缺的训练脚本,所以咱们能够咱们所间接在 Gitee 中克隆 MindSpore 开源我的项目仓库,具体的地位链接:https://gitee.com/mindspore/m…
本次应用的 python 文件,在运行 train.py 的时候也须要设置 config_path、dataset_path、platform、pretrain_ckpt 与 freeze_layer 五个参数。验证时,运行 eval.py 并且传入 config_path、dataset_path、platform、pretrain_ckpt 四个参数。命令如下
Windows train with Python file
python train.py –config_path [CONFIG_PATH] –platform [PLATFORM] –dataset_path <DATASET_PATH> –pretrain_ckpt [PRETRAIN_CHECKPOINT_PATH] –freeze_layer[(“none”, “backbone”)]
Windows eval with Python file
python eval.py –config_path [CONFIG_PATH] –platform [PLATFORM] –dataset_path <DATASET_PATH> –pretrain_ckpt <PRETRAIN_CHECKPOINT_PATH>
以上便是训练该模型的根本的步骤。当然不同的环境会有不同的配置和运行办法,反对 Windows 和 Linux 零碎,反对 CPU、GPU 和 Ascend 硬件平台上应用,具体的参数设置和应用请大家参考官网中教程:https://www.mindspore.cn/docs…
总结
本次小 Mi 分享的第一局部次要给大家介绍了 Moilenet_V2 网络模型的深度可拆散卷积构造,模型中所遇到的线性瓶颈问题,以及应答线性瓶颈问题所提出的倒置残差解决办法。第二局部介绍了 ImageNet 数据集的根本参数信息,也提供了数据集下载的地址。第三局部是介绍了 MindSpore 的框架中的 Moilenet_V2 模型的脚本和信息,以及官网教程中的运行领导,欢送大家尝试,如果有应用问题欢送留言交换哦!