卷积神经网络模型设计

一、模型设计概述

1、网络设计的目的

1、为了节省设备存储空间

让神经网络在更小计算力的设备上运行。同样价格的PC和移动设备下,PC机的计算力要比移动设备强大很多,所以如何让神经网络网络在移动设备上也能够运行,就涉及到了网络模型的设计。

2、为了提升网络的训练效率

网络模型经过设计后,不仅能够降低模型对硬件设备算力和储存容量的依赖,还能够大大的提升在训练中模型收敛的速度。

3、为了提升模型输出的精度

经过精心设计的模型,不仅节省储存空间,加快模型收敛速度,还能够有效的提升模型最终输出的精度。当然有时候对算力、速度和精度这三者之间是需要有一定的相互取舍的。

2、网络设计的重点

精度-------->accuracy

容量--------->params

效率---------->flops

设计要点:层次要深,信息要充分融合,计算量要足够小。

二、网络设计的形式

1、3*3和1*1的卷积

 

卷积神经网络模型设计

spatial(像素)层面:稀疏连接

channel(通道)层面:全连接(稠密连接)

卷积神经网络模型设计

spatial(像素)层面:逐点卷积:弊端:像素层面未进行融合

channel(通道)层面:全连接(稠密连接)

 

2、分组卷积

1、普通卷积:

卷积神经网络模型设计

图1 普通卷积

上图为普通卷积示意图,为方便理解,图中只有一个卷积核,此时输入输出数据为:

输入feature map尺寸: W×H×C ,分别对应feature map的宽,高,通道数;

单个卷积核尺寸: k×k×C ,分别对应单个卷积核的宽,高,通道数;

输出feature map尺寸 :W'×H' ,输出通道数等于卷积核数量,输出的宽和高与卷积步长有关,这里不关心这两个值。

参数量 卷积神经网络模型设计

运算量卷积神经网络模型设计,这里只考虑浮点乘数量,不考虑浮点加。

2、group convolution (分组卷积):

卷积神经网络模型设计

图2 分组卷积

将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图2所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成个feature map。

输入每组feature map尺寸:,共有g组;

单个卷积核每组的尺寸:卷积神经网络模型设计,一个卷积核被分成了g组;

输出feature map尺寸:卷积神经网络模型设计,共生成g个feature map。

 

再来计算一下分组卷积时的参数量和运算量:

参数量

卷积神经网络模型设计

运算量

卷积神经网络模型设计

可以看出相同的参数量运算量生成了g个feature map

所以group conv常用在轻量型高效网络中,因为它用少量的参数量和运算量就能生成大量的feature map,大量的feature map意味着能够编码更多的信息。

从分组卷积的角度来看,分组数g就像一个控制旋钮,最小值是1,此时g=1的卷积就是普通卷积;最大值是输入feature map的通道数C,此时g=C的卷积就是depthwise sepereable convolution,即深度分离卷积,又叫逐通道卷积。

 

分组卷积的常见形式:

卷积神经网络模型设计卷积神经网络模型设计

一个具有瓶颈结构的残差单元由conv1x1、conv3x3和conv1x1组成。第一个conv1x1减少输入通道的维度,这降低了后续conv3x3相对高昂的计算成本。

最后的con1x1恢复输出通道的维度

3、深度可分离卷积

1、正常卷积

原始图像是二维的,大小是12x12。由于是RGB格式的,所以有三个通道,这相当于是一个3维的图片。其输入图片格式是:12x12x3。滤波器窗口大小是5x5x3。这样的话,得到的输出图像大小是8x8x1(padding模式是valid)。

12x12x3 * 5x5x3 => 8x8x1

卷积神经网络模型设计

一个5x5x3滤波器得到的输出图像8x8x1,仅仅提取到的图片里面的一个属性。如果希望获取图片更多的属性,譬如要提取256个属性,则需要:

12x12x3 * 5x5x3x256 => 8x8x256

卷积神经网络模型设计

正常卷积的问题在于,它的卷积核是针对图片的所有通道设计的(通道的总数就是depth)。那么,每要求增加检测图片的一个属性,卷积核就要增加一个。所以正常卷积,卷积参数的总数=属性的总数x卷积核的大小。

深度可分离卷积

深度可分离卷积的方法有所不同。正常卷积核是对3个通道同时做卷积。也就是说,3个通道,在一次卷积后,输出一个数。

深度可分离卷积分为两步:

  • 第一步用三个卷积对三个通道分别做卷积,这样在一次卷积后,输出3个数。
  • 这输出的三个数,再通过一个1x1x3的卷积核(pointwise核),得到一个数。

所以深度可分离卷积其实是通过两次卷积实现的。

第一步,对三个通道分别做卷积,输出三个通道的属性:

卷积神经网络模型设计

第二步,用卷积核1x1x3对三个通道再次做卷积,这个时候的输出就和正常卷积一样,是8x8x1:

卷积神经网络模型设计

如果要提取更多的属性,则需要设计更多的1x1x3卷积核心就可以(图片引用自原网站。感觉应该将8x8x256那个立方体绘制成256个8x8x1,因为他们不是一体的,代表了256个属性):

卷积神经网络模型设计

可以看到,如果仅仅是提取一个属性,深度可分离卷积的方法,不如正常卷积。随着要提取的属性越来越多,深度可分离卷积就能够节省更多的参数。

 

常见形式:

MobileNet-v1中使用

卷积神经网络模型设计

 

depthwise conv层的通道为进行融合,所以可以增加通道。通道增加后在缩小所以融合更加充分

MobileNet-v2中使用(结构一)


卷积神经网络模型设计

 

MobileNet-v2中使用(结构二)

 

卷积神经网络模型设计

4、通道混洗

卷积神经网络模型设计

卷积神经网络模型设计

如图:在像素层面输入与输出相同,但是在通道层面进行了融合。

5、像素混洗

像素混洗

卷积神经网络模型设计

将一张图通过普通卷积,将通道扩充到指定通道数,比如3个通道到9个通道,然后将每个通道上的第一个值合成一个长度为9的向量,resize成3*3的一个小特征图,依次类推,将第二个值的集合组成第二个小特征图,最后将这些小特征图组成一张大的特征图,再将每个3*3的小特征图汇总成一个特征,变成和原输入图一样的大小,就完成了像素级别的混合。

部分内容参考资料:

https://www.jianshu.com/p/a936b7bc54e3

https://blog.csdn.net/makefish/article/details/88716534

https://mp.weixin.qq.com/s/I4Q1Bv7yecqYXUra49o7tw

https://www.cnblogs.com/jins-note/p/11342947.html