简介
目前的神经网络模型层出不穷,其中在图像识别的畛域不仅十分高效疾速,而且准确率也十分高。但咱们在进步准确率的路线上是永不止步的,比拟矛盾的是在进步准确率的同时也会带来耗费,须要更高的计算资源,这对模型的利用是很大的门槛。本次分享小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模型的脚本和信息,以及官网教程中的运行领导,欢送大家尝试,如果有应用问题欢送留言交换哦!
发表回复