点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

01.引言

SqueezeNet是Han等提出的一种轻量且高效的CNN模型,它参数比AlexNet少50x,但模型性能(accuracy)与AlexNet接近。

在可接受的性能下,小模型相比大模型,具有很多优势:

  1. 更高效的分布式训练,小模型参数小,网络通信量减少;

  2. 便于模型更新,模型小,客户端程序容易更新;

  3. 利于部署在特定硬件如FPGA,因为其内存受限。因此研究小模型是很有现实意义的。

Han等将CNN模型设计的研究总结为四个方面:

  1. 模型压缩:对pre-trained的模型进行压缩,使其变成小模型,如采用网络剪枝和量化等手段;

  2. 对单个卷积层进行优化设计,如采用1x1的小卷积核,还有很多采用可分解卷积(factorized convolution)结构或者模块化的结构(blocks, modules);

  3. 网络架构层面上的优化设计,如网路深度(层数),还有像ResNet那样采用“短路”连接(bypass connection);

  4. 不同超参数、网络结构,优化器等的组合优化。

SqueezeNet也是从这四个方面来进行设计的,其设计理念可以总结为以下三点:

  1. 大量使用1x1卷积核替换3x3卷积核,因为参数可以降低9倍;

  2. 减少3x3卷积核的输入通道数(input channels),因为卷积核参数为:(number of input channels) * (number of filters) * 3 * 3.

  3. 延迟下采样(downsample),前面的layers可以有更大的特征图,有利于提升模型准确度。目前下采样一般采用strides>1的卷积层或者pool layer。

02.SqueezeNet网络结构

SqueezeNet网络基本单元是采用了模块化的卷积,其称为Fire module。Fire模块主要包含两层卷积操作:一是采用1x1卷积核的squeeze层;二是混合使用1x1和3x3卷积核的expand层。Fire模块的基本结构如图1所示。在squeeze层卷积核数记为s_1x1,在expand层,记1x1卷积核数为e_1x1,而3x3卷积核数为e_3x3。为了尽量降低3x3的输入通道数,这里让s_1x1的值小于e_1x1与e_3x3的和。这算是一个设计上的trick。

图1 Fire模块的基本结构示意图

整个SqueezeNet就是使用Fire基本模块堆积而成的,网络结构如图2所示,其中左图是标准的SqueezeNet,其开始是一个卷积层,后面是Fire模块的堆积,值得注意的是其中穿插着stride=2的maxpool层,其主要作用是下采样,并且采用延迟的策略,尽量使前面层拥有较大的feature map。中图和右图分别是引入了不同“短路”机制的SqueezeNet,这是借鉴了ResNet的结构。具体每个层采用的参数信息如表1所示。

图2 SqueezeNet网络结构

表1 SqueezeNet各层参数信息

下面说一下SqueezeNet的一些具体的实现细节:

  1. 在Fire模块中,expand层采用了混合卷积核1x1和3x3,其stride均为1,对于1x1卷积核,其输出feature map与原始一样大小,但是由于它要和3x3得到的feature map做concat,所以3x3卷积进行了padding=1的操作,实现的话就设置padding=”same”;

  2. Fire模块中所有卷积层的激活函数采用ReLU;

  3. Fire9层后采用了dropout,其中keep_prob=0.5;

  4. SqueezeNet没有全连接层,而是采用了全局的avgpool层,即pool size与输入feature map大小一致;

  5. 训练采用线性递减的学习速率,初始学习速率为0.04。

03.SqueezeNet性能

从网络结构来看,SqueezeNet也算是设计精良了,但是最终性能还是要实验说话。论文作者将SqueezeNet与AlexNet在ImageNet上做了对比,值得注意的是,不仅对比了基础模型之间的差异,还对比了模型压缩的性能,其中模型压缩主要采用的技术有SVD,网络剪枝(network pruning)和量化(quantization)等。具体的对比结果如表2所示。

首先看一下基准模型的性能对比,SqueezeNet的Top-1优于AlexNet,Top-5性能一样,但是最重要的模型大小降低了50倍,从240MB->4.8MB,这个提升是非常有价值的,因为这个大小意味着有可能部署在移动端。作者并没有止于此,而是继续进行了模型压缩。其中SVD就是奇异值分解,而所谓的网络剪枝就是在weight中设置一个阈值,低于这个阈值就设为0,从而将weight变成系数矩阵,可以采用比较高效的稀疏存储方式,进而降低模型大小。

值得一提的Deep Compression技术,这个也是Han等提出的深度模型压缩技术,其包括网络剪枝,权重共享以及Huffman编码技术。这里简单说一下权重共享,其实就是对一个weight进行聚类,比如采用k-means分为256类,那么对这个weight只需要存储256个值就可以了,然后可以采用8 bit存储类别索引,其中用到了codebook来实现。关于Deep Compression详细技术可以参加文献[2]。

从表2中可以看到采用6 bit的压缩,SqueezeNet模型大小降到了0.47MB,这已经降低了510倍,而性能还保持不变。为了实现硬件加速,Han等还设计了特定的硬件来高效实现这种压缩后的模型,具体参加文献[3]。

顺便说过题外话就是模型压缩还可以采用量化(quantization),说白了就是对参数降低位数,比如从float32变成int8,这样是有道理,因为训练时采用高位浮点是为了梯度计算,而真正做inference时也许并不需要这么高位的浮点,TensorFlow中是提供了量化工具的,采用更低位的存储不仅降低模型大小,还可以结合特定硬件做inference加速。

表2 SqueezeNet与AlexNet的对比结果

除了上面的工作,作者还探索了网络的设计空间,包括微观结构和宏观结构,微观结构包括各个卷积层的维度等设置,宏观结构比如引入ResNet的短路连接机制,详细内容可以参考原论文[1]。

04.SqueezeNet的TensorFlow实现

Fire模块中的expand层可以看成两个普通的卷积层,然后做concat,所以SqueezeNet很容易使用TensorFlow实现:

class SqueezeNet(object):def __init__(self, inputs, nb_classes=1000, is_training=True):# conv1net = tf.layers.conv2d(inputs, 96, [7, 7], strides=[2, 2],padding="SAME", activation=tf.nn.relu,name="conv1")        # maxpool1net = tf.layers.max_pooling2d(net, [3, 3], strides=[2, 2],name="maxpool1")        # fire2net = self._fire(net, 16, 64, "fire2")        # fire3net = self._fire(net, 16, 64, "fire3")        # fire4net = self._fire(net, 32, 128, "fire4")        # maxpool4net = tf.layers.max_pooling2d(net, [3, 3], strides=[2, 2],name="maxpool4")        # fire5net = self._fire(net, 32, 128, "fire5")        # fire6net = self._fire(net, 48, 192, "fire6")        # fire7net = self._fire(net, 48, 192, "fire7")        # fire8net = self._fire(net, 64, 256, "fire8")        # maxpool8net = tf.layers.max_pooling2d(net, [3, 3], strides=[2, 2],name="maxpool8")        # fire9net = self._fire(net, 64, 256, "fire9")        # dropoutnet = tf.layers.dropout(net, 0.5, training=is_training)        # conv10net = tf.layers.conv2d(net, 1000, [1, 1], strides=[1, 1],padding="SAME", activation=tf.nn.relu,name="conv10")        # avgpool10net = tf.layers.average_pooling2d(net, [13, 13], strides=[1, 1],name="avgpool10")        # squeeze the axisnet = tf.squeeze(net, axis=[1, 2])self.logits = netself.prediction = tf.nn.softmax(net)    def _fire(self, inputs, squeeze_depth, expand_depth,scope):with tf.variable_scope(scope):squeeze =tf.layers.conv2d(inputs, squeeze_depth, [1, 1],strides=[1, 1], padding="SAME",activation=tf.nn.relu, name="squeeze")            # squeezeexpand_1x1 = tf.layers.conv2d(squeeze, expand_depth, [1, 1],strides=[1, 1], padding="SAME",activation=tf.nn.relu, name="expand_1x1")expand_3x3 =tf.layers.conv2d(squeeze, expand_depth, [3, 3],strides=[1, 1], padding="SAME",activation=tf.nn.relu, name="expand_3x3")return tf.concat([expand_1x1, expand_3x3], axis=3)

05.总结

本文简单介绍了移动端CNN模型SqueezeNet,其核心是采用模块的卷积组合,当然做了一些trick,更重要的其结合深度模型压缩技术,因此SqueezeNet算是结合了小模型的两个研究方向:结构优化和模型压缩。

06.参考资料

  1. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size: https://arxiv.org/abs/1602.07360.

  2. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding: https://arxiv.org/abs/1510.00149.

  3. EIE: Efficient inference engine on compressed deep neural network: https://arxiv.org/abs/1602.01528.

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

CNN模型之SqueezeNet相关推荐

  1. squeezenet代码_轻量级CNN模型之squeezenet

    SqueezeNet 和别的轻量级模型一样,模型的设计目标就是在保证精度的情况下尽量减少模型参数.核心是论文提出的一种叫"fire module"的卷积方式. 设计策略 主要用1x ...

  2. CNN模型 INT8 量化实现方式(一)

    当前CNN模型基本都是 float32,将其转换为 INT8 可以降低模型大小,提升速度,精度降低的也不太多.那么在实际中如何实现这个量化了?在网上找到了三种实践方法, 基于腾讯的NCNN, Tens ...

  3. 为了压榨CNN模型,这几年大家都干了什么

    如果从2006年算,深度学习从产生到火爆已经十年了,在工业界已经产生了很多落地的应用.现在网络的深度已经可达1000层以上,下面我们关注一个问题: 这些年大家是怎么"压榨"CNN模 ...

  4. 一文总结经典卷积神经网络CNN模型

    一般的DNN直接将全部信息拉成一维进行全连接,会丢失图像的位置等信息. CNN(卷积神经网络)更适合计算机视觉领域.下面总结从1998年至今的优秀CNN模型,包括LeNet.AlexNet.ZFNet ...

  5. 转-CNN模型的压缩与加速算法综述

    本文转自微信公众号:微信AI 原文地址:链接 前言 自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域.CN ...

  6. 一些常见的CNN模型

    最近闲着无聊在家敲了一些基本的CNN模型,这里对网上资料做一个简要的整理总结,供自己学习使用. 一.VGG ​ VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet.但是VGG模 ...

  7. Pytorch实现CNN模型的迁移学习——蜜蜂和蚂蚁图片分类项目

    很多时候当训练一个新的图像分类任务时,一般不会完全从一个随机的模型开始训练,而是利用预训练的模型来加速训练的过程.经常使用在ImageNet上的预训练模型. 这是一种transfer learning ...

  8. CNN 模型压缩与加速算法总结

    CNN 模型压缩与加速算法 转载地址:https://blog.csdn.net/QcloudCommunity/article/details/77719498 导语:卷积神经网络日益增长的深度和尺 ...

  9. CNN 模型压缩与加速算法综述

    导语:卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一.  作者:姜媚 前言 自从AlexNet一举夺得ILS ...

最新文章

  1. EF跨库查询,DataBaseFirst下的解决方案
  2. mysql的indata文件_【数据分析】MySQL之不能导入本地文件“Loading local data is disable;”...
  3. LeetCode 1554. 只有一个不同字符的字符串(枚举)
  4. 《linux操作系统》第06章在线测试,Linux系统管理一测试题-附答案.doc
  5. 通过html备份数据库文件,备份网站文件和数据库
  6. 【sklearn第十一讲】随机梯度下降
  7. 能源行业将被重构,大数据有哪些“挖”法?
  8. python seaborn 散点图矩阵_Kaggle、Python数据可视化seaborn(四):散点图
  9. 第六届开源操作系统年度技术会议将在12月16日杭州浙江大学举办
  10. 基于单片机花式喷泉喷水池控制系统设计-单片机的简易电子钟加闹钟设计-51单片机车汽车流量检测电路系统-51单片机超声波三方向测距系统设计-基于51单片机超声波水位液位控制系统毕业设计
  11. HTTP代理怎样使用
  12. A Frustratingly Easy Approach for Joint Entity and Relation Extraction(陈丹琦2020)
  13. Exploring Phrase Grounding without Training: Contextualisation and Extension to Text-Based Image Ret
  14. Android动画完全解析--属性动画
  15. 关于前端框架vue/react及UI框架的配合
  16. 2009,新展望!站得稳雄得起!
  17. Jmeter 性能测试之阶梯式场景、波浪式场景
  18. 正则表达式匹配连续多个空格或tab空格
  19. 下载安装 gSoap
  20. tushare获得沪深300和中证500的股票

热门文章

  1. 如何优雅地使用pdpipe与Pandas构建管道?
  2. 2020年趋势一览:AutoML、联邦学习、云寡头时代的终结
  3. DLM:微信大规模分布式n-gram语言模型系统
  4. 中科院、百度研究院等联合提出UGAN,生成图片难以溯源
  5. Java基于Swing和Netty仿QQ界面聊天小项目
  6. Nginx + Spring Boot 实现负载均衡
  7. 程序员必备网站之一:No Design
  8. Spring Cloud Alibaba教程:使用Nacos作为服务注册中心
  9. 机器学习面试的12个基础问题,强烈推荐!
  10. 985高校博士情侣致谢:我俩每月补贴600元,在一线城市生活5年