卷积神经网络模型设计
一、模型设计概述
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