Pytorch之shuffleNet图像分类

目录
前言
一、 V1
1.分组卷积(Group )
2.通道洗牌( )
3. Unit
4.网络结构
二、 V2
1.高效网络设计的实用准则
(1) Equalwidthcost (MAC)
(2)groupMAC
(3)of
(4)-wiseare non-
2. 网络结构
三、网络实现
1.构建网络
2.训练和测试模型
四、实现图像分类
前言
是Face++(旷视)在2017年发布的一个高效率可以运行在手机等移动设备的网络结构 , 论文发表在上 。它是一种轻量级卷积神经网络架构 , 旨在在计算资源有限的情况下实现高效的模型推理 。它是专门为计算能力有限的移动平台设计的 。
通过逐点分组卷积( Group ) 和通道洗牌( ) 两种新运算 , 在保持精度的同时大大降低了计算成本。
比最近的在分类任务上的 top-1误差更低 (绝对7.8%)。在基于ARM的移动设备上 ,  比实现了约13倍的实际加速 , 同时保持了相当的精度。
一、 V1
2017年之前 , 最优的算法结构例如、等因为大量使用1×1卷积 , 虽然会使模型变小 , 但导致计算效率降低 。中的 group 可以降低1×1卷积的计算复杂度 。但是group卷积也有一定缺点 , 为了解决组卷积带来的副作用 , 提出了 来帮助信息在各通道之间流动 。
与热门的VGG和相比 , 在限定的计算复杂度之内 , 允许有更多的特征映射通道 , 这有助于编码更多的信息 , 并且这对非常小的网络的性能特别关键 。
1.分组卷积(Group )
分组卷积(Group )的概念首先是在中引入 , 用于将模型分布到两块 GPU 上。
Group 是将输入层的不同特征图进行分组 , 然后采用不同的卷积核再对各个组进行卷积 , 这样会降低卷积的计算量 。因为一般的卷积都是在所有的输入特征图上做卷积 , 可以说是全通道卷积 , 这是一种通道密集连接方式( dense ) , 而group 相比则是一种通道稀疏连接方式() 。
常规卷积 VS 分组卷积
如果输入 map尺寸为C?H?W , 卷积核有N个 , 输出 map与卷积核的数量相同也是N , 每个卷积核的尺寸为C?K?K , N个卷积核的总参数量为N?C?K?K , 输入map与输出map的连接方式如上图左所示 。
Group  , 则是对输入 map进行分组 , 然后每组分别卷积 。
假设输入 map的尺寸仍为C?H?W , 输出 map的数量为N个 , 如果设定要分成G个 , 则每组的输入 map数量为C/G , 每组的输出 map数量为N/G , 每个卷积核的尺寸为C/G?K?K , 卷积核的总数仍为N个 , 每组的卷积核数量为N/G , 卷积核只与其同组的输入map进行卷积 , 卷积核的总参数量为N?C/G?K?K 。
可见 , 总参数量减少为原来的1/G , 其连接方式如上图右所示 , 输出map数为2 , 有2个卷积核 , 每个卷积核的数为4 , 与的输入map的数相同 , 卷积核只与同组的输入map卷积 , 而不与其他组的输入map卷积 。
在小型网络中 , 逐点卷积会导致满足复杂度约束的通道数量有限 , 从而严重的影响精度 ;最直接的解决方案是:采用通道稀疏连接() , 例如分组卷积可以大大降低计算成本。但是 , 这样就会出现一个 问题 :某个通道的输出只能来自一小部分输入通道 , 这样阻止了通道之间的信息流 , 也就削弱了神经网络表达能力 ;