轻量级网络:SqueezeNet(2016)

SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 1MB model size(2016)
论文链接:http://arxiv.org/abs/1602.07360 
代码链接:https://github.com/DeepScale/SqueezeNet

NNCC:SqueezeNet可以极大地减少参数的数量,相较AlexNet参数减少50倍以上,但是这个过程增加了更多的“乘—加”运算,在速度上没有明显提升。不过,同样是轻量级网络的MobileNet就实现了参数量和计算量同时减少的功能。

轻量级网络:MobileNet和SqueezeNet的比较
https://blog.csdn.net/duan19920101/article/details/104345525

简介

近来深层卷积网络的主要研究方向集中在提高正确率。对于相同的正确率水平(对于一个给定的正确率,通常可以找到多种CNN架构来实现与之相近的正确率),参数数量更少的CNN架构有如下优势:

(1)更高效的分布式训练

在分布式训练中,与服务器通信需求更小。服务器间的通信是分布式CNN训练的重要限制因素。对于分布式数据并行训练方式,通信需求和模型参数数量正相关。小模型对通信需求更低。

(2)减小下载模型到客户端的额外开销

参数更少,从云端下载模型的数据量小。比如在自动驾驶中,经常需要更新客户端模型。更小的模型可以减少通信的额外开销,使得更新更加容易。

(3)便于FPGA和嵌入式硬件上的部署

更适合在FPGA等内存受限的设备上部署。

基于这些优点,本文提出SqeezeNet。它在ImageNet上实现了和AlexNet相同的正确率,但是只使用了1/50的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到0.5MB,这是AlexNet的1/510。

SqueezeNet网络模型非常小,但分类精度接近AlexNet。这里复习一下卷积层参数的计算:

输入通道ci,核尺寸k,输出通道co,参数个数为:c1*k2*c0
以AlexNet第一个卷积为例,参数量达到:3*11*11*96=34848

 

基础模块

该模块包含三个卷积层(蓝色),步长为1,分为squeezeexpand两部分,分别压缩和扩展数据(灰色矩形)的通道数。

expand部分中,两个不同核尺寸的结果通过串接层(黄色)合并输出

fire module模块有三个可调参数:

- s1:squeeze部分,1x1卷积层的通道数

- e1:expand部分,1x1卷积层的通道数

- e3:expand部分,3x3卷积层的通道数

输入输出尺寸相同。输出通道数不限,输出通道数为e1+e3

在本文提出SqueezeNet结构中,e1=e3=4*s1

使用以下三个策略来减少SqueezeNet设计参数

(1)使用1∗1卷积代替3∗3卷积:参数减少为原来的1/9;

(2)减少输入通道数量:这一部分使用squeeze layers来实现;

(3)将欠采样操作延后,可以给卷积层提供更大的激活图:更大的激活图保留了更多的信息,可以提供更高的分类准确率。 

其中,(1)和(2)可以显著减少参数数量,(3)可以在参数数量受限的情况下提高准确率。

 

网络结构

整个网络包含10层

第1层为卷积层(蓝色),缩小输入图像,提取96维特征;

第2到9层为fire模块(红色),每个模块内部先减少通道数(squeeze)再增加通道数(expand)。每两个模块之后,通道数会增加;

在1、4、8层之后加入降采样的max pooling(绿色),缩小一般尺寸;

第10层又是卷积层(蓝色),为小图的每个像素预测1000类分类得分;

最后用一个全图average pooling(绿色)得到这张图的1000类得分,使用softmax函数归一化为概率;

这是一个全卷积网络,避免了如今越来越不受待见的全连接层。由于最后一层提供了全图求平均操作,可以接受任意尺寸的输入。当然,输入还是需要归一化大致相当的尺寸,保持统一尺度;

全连接层的参数多,对性能提升帮助不大,现在往往被pooling代替

这个网络达到了和AlexNet相当的分类精度,但模型缩小了50倍。

 

网络设计的要点

1. 为了使1x1和3x3filter输出的结果有相同的尺寸,在expand modules中,给3x3filter的原始输入添加一个像素的边界(zero-padding);

2. squeeze和expand layers中都是用ReLU作为激活函数;

3. 在fire9 module之后,使用Dropout,比例取50%;

4. 训练过程中,初始学习率设为0.04,在训练过程中线性降低学习率;

5. 由于caffe中不支持使用两个不同尺寸的filter,在expand layer中实际上使用了两个单独的卷积层(1x1filter和3x3filter),最后将这两层的输出连接在一起,这在数值上等价于使用单层但是包含两个不同尺寸的filter。

 

参数组合

每层fire模块的三个参数如果单独设计,需要尝试的组合太多。需要使用超参数进行规划:

- 首个fire模块中包含base个3×3核;每隔freq个fire模块,3×3模块增加incre个。

- expand部分中,3×3核占expand中核总数比例为pct。

- squeeze中核数与expand中核数比例为sr。

sr和pct增大可以提升准确率,但模型尺寸增大。本文取sr=0.125,pct=0.5。

 

参数压缩

https://blog.csdn.net/shenxiaolu1984/article/details/51444525

当然SqueezeNet还可以继续压缩,使模型更小。SqueezeNet采用了一些deep-compression的方法,比如裁剪,量化和编码:

裁剪:设置阈值,对于小于阈值的参数直接写0,然后用非零参数再次训练;

量化:对参数做聚类,然后每个类别的参数的梯度值相加,作用在聚类中心上;

编码:Huffman编码进一步压缩存储。

 

常用的模型压缩技术有:

https://blog.csdn.net/csdnldp/article/details/78648543

(1)奇异值分解(singular value decomposition (SVD))1

(2)网络剪枝(Network Pruning)2:使用网络剪枝和稀疏矩阵

(3)深度压缩(Deep compression)3:使用网络剪枝,数字化和huffman编码

(4)硬件加速器(hardware accelerator)4

 

神经网络设计空间

由于超参数繁多,深度神经网络具有很大的设计空间(design space)。通常进行设计空间探索的方法有: 
(1)贝叶斯优化 
(2)模拟退火 
(3)随机搜索 
(4)遗传算法

 

原文参考:https://www.cnblogs.com/gezhuangzhuang/p/10921933.html

 

发布了207 篇原创文章 · 获赞 890 · 访问量 129万+

猜你喜欢

转载自blog.csdn.net/duan19920101/article/details/104345637
今日推荐