Pytorch之shuffleNet图像分类( 二 )


为此作者进一步将分组卷积和深度可分离卷积推广为一种新的形式:通道洗牌操作() 。
2.通道洗牌( )
为达到特征通信目的 , 采用 操作 , 其含义是对Group 后的特征图进行重组 , 这样可以保证接下了采用的Group 其输入来自不同的组 , 因此信息可以在不同组之间流转 。进一步的展示了这一过程并随机 , 其实是均匀地打乱 。
对于普通分组卷积 , 如上图 a 所示 , 都是针对该组内的信息进行卷积操作 , 如果简单串联的话 , 则一直对同一个组内的信息进行处理 , 组与组之间是没有信息交流的 , 阻止了通道之间的信息流 , 也就削弱了神经网络表达能力 。
当加入操作 , 首先还是进行分组卷积得到特征矩阵 , 假设使用三个 group , 如上图 b 所示 。然后对特征矩阵原来的 group 再进行更细粒度的划分成三个 sub-group , 将每个组中的第一个 sub-group 放到一起 , 将每个组中的第二个 sub-group 放到一起… , 就能形成新的特征矩阵 , 如(c)中的。然后再进行分组卷积 , 就使得组与组之间的信息可以得到交流 。
通过通道洗牌( )允许分组卷积从不同的组中获取输入数据 , 从而实现输入通道和输出通道相关联 。
3. Unit
Unit是基于残差块( block)、Group 和 设计 。
(a)深度卷积(b)逐点分组卷积(c)逐点分组卷积(=2)
图(a)是 block
①1×1卷积(降维)+3×3深度卷积+1×1卷积(升维)
②之间有BN和ReLU
③最后通过add相加
图(b)为输入输出特征图大小不变的 Unit
①将第一个用于降低通道数的1×1卷积改为1×1分组卷积 +
②去掉原3×3深度卷积后的ReLU
③ 将第二个用于扩增通道数的1×1卷积改为1×1分组卷积
(b)展示了改进思路:将密集的1x1卷积替换成1x1的Group (因为主要计算量较大的地方是密集的1x1的卷积操作) , 然后在之后增加了一个 操作 。第二个逐点群卷积的目的是恢复通道维数以匹配路径 。为了简单起见 , 不在第二个逐点层之后应用额外的 操作 , 因为它产生的结果变化不大 。这里是为1的情况 。
图(c)为输出特征图大小为输入特征图大小一半的 Unit
①将第一个用于降低通道数的1×1卷积改为1×1分组卷积 +
②令原3×3深度卷积的步长=2 ,  并且去掉深度卷积后的ReLU
③将第二个用于扩增通道数的1×1卷积改为1×1分组卷积
④上添加一个3×3平均池化层(=2)用于匹配特征图大小
⑤对于块的输出 , 将原来的add方式改为方式
(c)降采样操作 , 对于使用>1(=2)的情况 , 只需做两个修改:
(1)在路径上添加3×3平均池化
(2)将逐元素相加ADD替换为通道级联 , 这使得可以在不增加额外计算成本的情况下轻松地扩大通道维数 。
、和网络的参数使用对比
计算可以知道 ,  V1的参数使用量比和网络的参数都要少 。在给定的有限的计算资源下 ,  能够使用更宽的特征图 。作者发现这对于小型网络来说至关重要 , 因为通常小型网络通常有很少的通道数来处理信息 。
4.网络结构
基于 Unit , 如下表中展示了整个 V1结构 , 首先使用的普通的3x3的卷积和max pool层 , 接着网络主要由为三个阶段的单元的堆栈组成(/3/4) , 每个stage第一层=2 , 从而实现降采样的功能 , 每个stage中的其他超参数保持不变 , 从上一个stage到下一stage中的输出通道数加倍 。与类似 , 每个 Unit中中的通道数设置为输出通道数的1/4 。