最近相关项目实践了MixNet网络,最终取得的效果不错,但是收敛的过程相对有些缓慢,具体原因还在分析当中,现将相关知识及代码解析如下。

如下主要包括3个部分,1是MixNet的原理知识解析(整理自网络),2是自己对于相应核心代码解析,3相关轻量级模型比较。

1. MixNet

 

其主要创新点是,研究不同卷积核尺寸的影响和观察到组合不同尺寸的卷积核能提高准确率。作者将混合了不同尺寸的卷积核的卷积操作命名为MDConv,并将其使用在深度可分离卷积中,能提高的MobileNet的准确率。

MLNet与pytorch结果不同 pytorch和mxnet对比_MLNet与pytorch结果不同


MLNet与pytorch结果不同 pytorch和mxnet对比_卷积核_02


MLNet与pytorch结果不同 pytorch和mxnet对比_卷积核_03


MLNet与pytorch结果不同 pytorch和mxnet对比_卷积_04


如上从左到右的点分别表示卷积核的尺寸由33增大到1313.

基于可分离卷积,又引入了分组卷积,对于不同组的通道分别执行不同卷积核尺寸的可分离卷积。

与inception的异同:都引入了不同的卷积核尺寸,但是其是基于可分离卷积的操作;
与xception的异同:都基于可分离卷积,但是其引入了不同的卷积核尺寸进行分组操作。

2. Mixnet网络模型的pytorch代码:

MLNet与pytorch结果不同 pytorch和mxnet对比_卷积_05


如forward函数所示,两头为基本的卷积操作conv及head_conv,中间的layers为MixBlock堆叠:mixblock具体如下:

MLNet与pytorch结果不同 pytorch和mxnet对比_MLNet与pytorch结果不同_06


如forward所示,其主要由mdconv、SE模块、project_conv及跳过连接组成;

其具体结构如下,

MLNet与pytorch结果不同 pytorch和mxnet对比_卷积核_07


先split每个通道,执行各自可分离卷积,最后结果再cat在一起。

MLNet与pytorch结果不同 pytorch和mxnet对比_权值_08


深度可分离卷积通过Conv2d中的group=in_channels,来控制逐通道的卷积;

MLNet与pytorch结果不同 pytorch和mxnet对比_权值_09


MLNet与pytorch结果不同 pytorch和mxnet对比_卷积_10

3. 相关轻量级模型对比

参考:https://www.sohu.com/a/215356462_465975

回顾一下近来的轻量级网络,包括:

MLNet与pytorch结果不同 pytorch和mxnet对比_卷积核_11


1.SqueezeNet主要引入了Fire module,其结构如下:

MLNet与pytorch结果不同 pytorch和mxnet对比_卷积_12


先使用11的卷积进行通道压缩,然后分别进行11和3*3的卷积,最后在concat一起。这里的思想跟如上讲的inceptionv3的方法是一致的。

2.MobileNet主要引入了深度可分离卷积depth-wise separable convolution,在如上的xception中也讲到了这一点,主要是将标准卷积分为两步:一是逐通道的卷积Depth-wise convolution,二是最后将所有通道的卷积结果再次通过1*1卷积进行组合Pointwise convolution。

3.ShuffleNet

shuffle 具体来说是 channel shuffle,是将各部分的 feature map 的 channel 进行有序的打乱,构成新的 feature map,以解决 group convolution 带来的「信息流通不畅」问题。(如上MobileNet 是用 point-wise convolution 解决的这个问题)

对比一下 MobileNet,采用 shuffle 替换掉 11 卷积,这样可以减少权值参数,而且是减少大量权值参数,因为在 MobileNet 中,11 卷积层有较多的卷积核,并且计算量巨大。

MLNet与pytorch结果不同 pytorch和mxnet对比_MLNet与pytorch结果不同_13


Channel shuffle 的操作非常简单,接下来看看 ShuffleNet,ShuffleNet 借鉴了 Resnet 的思想,从基本的 resnet 的 bottleneck unit 逐步演变得到 ShuffleNet 的 bottleneck unit,然后堆叠的使用 ShuffleNet bottleneck unit 获得 ShuffleNet;下图展示了 ShuffleNet unit 的演化过程:

MLNet与pytorch结果不同 pytorch和mxnet对比_MLNet与pytorch结果不同_14


如上图a为深度可分离卷积DWConv;b使用了分组卷积GConv,并在第一个分组卷积后面加入了channel shuffle;c在旁路使用了平均池化AVG,来降低图像分辨率,最后使用了concat而不是add,用来弥补分辨率的损失。

4.Xception这一块,在上一篇文章与inception一同进行了讲解及代码分析。
先用 11 卷积核对各通道之间(cross-channel)进行卷积,然后再分别使用33卷积核对各通道进行卷积。详见:从Inception到Xception(含网络模型pytorch代码解析)