热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

论文阅读笔记(一)——squeezenet

——论文阅读笔记(一)——squeezenet前言寒假希望自己能够有所提升吧,不要再当一个简单地代码搬运工,所以希望自己能够坚持下来每天阅读一些文章,然后进行总结,冲冲冲1论文简介




——论文阅读笔记(一)——squeezenet

前言

寒假希望自己能够有所提升吧,不要再当一个简单地代码搬运工,所以希望自己能够坚持下来每天阅读一些文章,然后进行总结,冲冲冲


1 论文简介


1.1关于文章

论文全称: SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE

这里提供几个链接,大家可以自己下载下来学习
百度网盘
链接:论文原文
提取码:huzs
官网链接
论文链接:论文链接
代码链接:代码链接


1.2 关于squeezenet

其实这篇文章相较于后续的其他轻量化网络,其实可以学习借鉴的东西并不多,但是由于这篇属于轻量化网络的开篇之作,最早公开于2016年2月,所以我想借用这次机会,从头学习一下轻量化网络的演变路程,希望可以收获一些感悟


2 文章正文


2.1 摘要

近年来,深度卷积神经网络(CNNs)的研究主要集中在提高精度上。对于给定的精度级别,通常可以识别多个达到该精度级别的CNN架构。在同等精度的情况下,较小的CNN体系结构至少有三个优点:
1)较小的CNN在分布式训练期间需要较少的跨服务器通信。
2) 较小的cnn需要较少的带宽才能将新车型从云端导出到自动驾驶汽车。
3) 更小的CNN更适合部署在FP-GAs和其他内存有限的硬件上。
为了提供所有这些优势,我们提出了一个称为挤压网的小型CNN架构。SqueezeNet在ImageNet上实现AlexNet级精度,参数减少50倍。此外,通过模型压缩技术,我们可以将squezenet压缩到小于0.5MB(比AlexNet小510倍)。
可在此处下载SqueezeNet架构:https://github.com/DeepScale/SqueezeNet


2.2 文章动机 Motivation

其实文章的重点在大多数网络都在往深而精确的网络中改进,但是现实生活中由于计算平台的限制,比如嵌入式系统,比如车载系统中,都没法提供足够的算力来计算大型的CNN网络,而目的方法都是对网络进行剪枝,作者想要提供一种简洁的小型网络,来满足
1)更有效的分布式训练
2)可以将新模型导出到客户端时开销更小
3)可行的FPGA和嵌入式部署
所以提出了squeezeNet模块


3 squeezenet:用较少的参数保持精度


3.1 压缩策略

squeezenet模型主要使用了三个策略







  • 3


    ×


    3



    3\times3


    3×3卷积替换成




    1


    ×


    1



    1\times1


    1×1卷积
    。文章中将大多数




    3


    ×


    3



    3\times3


    3×3卷积替换为




    1


    ×


    1



    1\times1


    1×1卷积,这使得一个卷积操作的参数两减少了9倍
  • 减少




    3


    ×


    3



    3\times3


    3×3卷积的通道数
    。一个




    3


    ×


    3



    3\times3


    3×3卷积的计算量是




    3


    ×


    3


    ×


    M


    ×


    N



    3\times3\times M \times N


    3×3×M×N其中M是输入Feature Map的通道数,而N是输出Feature Map的通道数,作者希望通过减少M.N来达到减少参数量的目的
  • 下采样后置,使卷积层具有较大的activation maps。这个举动会提高网络精度,但是也会增加网络的计算量。在卷积网络中,每个卷积层产生空间分辨率至少为1x1且通常远大于1x1的输出激活图。这些activation maps的高度和宽度由以下因素控制:
    • 输入数据的大小(例如256x256图像)
    • 下采样的位置

3.2 Fire模块

fire模块由以下两部分组成


  • squeeze部分
    • 一组连续的




      1


      ×


      1



      1\times1


      1×1的卷积
  • Expand部分
    • 一组连续的




      1


      ×


      1



      1\times1


      1×1卷积和一组连续的




      3


      ×


      3



      3\times3


      3×3卷积cancatnate组成。因此




      3


      ×


      3



      3\times3


      3×3卷积需要使用same卷积

在fire模块中有三组超参数:





s



1


×


1





s_{1\times1}


s1×1​、





e



1


×


1





e_{1\times1}


e1×1​ 、





e



3


×


3





e_{3\times3}


e3×3​。squeeze部分的




1


×


1



1\times1


1×1卷积的通道数记作





s



1


×


1





s_{1\times1}


s1×1​。而expand部分




1


×



1\times


1×卷积和




3


×


3



3\times3


3×3卷积的通道数分别记作





e



1


×


1





e_{1\times1}


e1×1​ 、





e



3


×


3





e_{3\times3}


e3×3​。作者建议使用Fire模块时,





s



1


×


1




<



e



1


×


1




+



e



3


×


3





s_{1\times1}

s1×1​



3


×


3



3\times3


3×3卷积之中加入瓶颈层,有助于限制3x3滤波器的输入通道数量。
fire模块
下面代码片段是Keras实现的Fire模块,注意拼接Feature Map的时候使用的是Cancatnate操作,这样不必要求





e



1


×


1




=



e



3


×


3





e_{1\times1}=e_{3\times3}


e1×1​=e3×3​。

def Fire_Model(x, s_1, e_1, e_3, fire_name):
# squeeze部分
squeeze_x = Conv2D(kernel_size=(1,1),filters=s_1x1,padding='same',activation='relu',name=fire_name+'_s1')(x)
# expand部分
expand_x_1 = Conv2D(kernel_size=(1,1),filters=e_1x1,padding='same',activation='relu',name=fire_name+'_e1')(squeeze_x)
expand_x_3 = Conv2D(kernel_size=(3,3),filters=e_3x3,padding='same',activation='relu',name=fire_name+'_e3')(squeeze_x)
expand = merge([expand_x_1, expand_x_3], mode='concat', concat_axis=3)
return expand

3.3 网络结构

图3是SqueezeNet的几个实现,左侧是不加short-cut的SqueezeNet,中间是加了short-cut的,右侧是short-cut跨有不同Feature Map个数的卷积的。作者在后续还补充了一些其他细节:


  1. 激活函数默认都使用ReLU;
  2. fire9之后接了一个rate为0.5的dropout;
  3. 使用same卷积。
    三种squeezenet的网络结构
    更详细的参数实现图

代码实现

def squeezeNet(x):
conv1 = Conv2D(input_shape = (224,224,3), strides = 2, filters=96, kernel_size=(7,7), padding='same', activation='relu')(x)
poo1 = MaxPool2D((2,2))(conv1)
fire2 = Fire_Model(poo1, 16, 64, 64,'fire2')
fire3 = Fire_Model(fire2, 16, 64, 64,'fire3')
fire4 = Fire_Model(fire3, 32, 128, 128,'fire4')
pool2 = MaxPool2D((2,2))(fire4)
fire5 = Fire_Model(pool2, 32, 128, 128,'fire5')
fire6 = Fire_Model(fire5, 48, 192, 192,'fire6')
fire7 = Fire_Model(fire6, 48, 192, 192,'fire7')
fire8 = Fire_Model(fire7, 64, 256, 256,'fire8')
pool3 = MaxPool2D((2,2))(fire8)
fire9 = Fire_Model(pool3, 64, 256, 256,'fire9')
dropout1 = Dropout(0.5)(fire9)
conv10 = Conv2D(kernel_size=(1,1), filters=1000, padding='same', activation='relu')(dropout1)
gap = GlobalAveragePooling2D()(conv10)
return gap

3.4 模型评估

因为squeezenet其实并不想后面的其他轻量化网络效果那么好,所以作者只是与alexnet进行了对比,使用ImageNet(Deng等人,2009)(ILSVRC 2012)数据集对图像进行分类,使用AlexNet5和相关的模型压缩结果作为比较的基础来评估squeezenet。

详细的实验对比这里也不过多赘述,主要就是与alexnet不同压缩情况进行对比,有兴趣的朋友下来可以看下原文(原文其实实验对比也不是像mobilenet那样还对比了目标检测的任务,可以看看)


总结

SqueezeNet主要的方法是




3


×


3



3\times3


3×3卷积替换成为




1


×


1



1\times1


1×1卷积,和减少




3


×


3



3\times3


3×3卷积的通道数这两种方法来降低参数量,然后通过下采样后置来提供精度,降低卷积被替换而损失的精度。从参数量来说,SqueezeNet的目的已经达到了。但是从效果上来说,其实SqueezeNet的效果其实并不像后面那几篇一样,有这很惊艳的方法。但是由于他算是真正意义上的第一篇轻量化网络,所以大家对此也算比较包容


收获


  1. 其实文章目标是嵌入式、车载系统等,以上环境更多追求的是实时性,虽然SqueezeNet减少了参数量,但是其丧失了网络的并行能力,整体的时间反而会更长,从这点上来说,这篇文章的结果并不算很完美
  2. 论文的结果其实与标题所说的减少,存在一定的夸大,这一点上论文也存在着一些问题
  3. 参数量不一定等于实时与速度,这一点在SqueezeNet丧失并行能力,导致运行时间更长就可以看出。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 橱窗设计的表现手法及其应用
    本文介绍了橱窗设计的表现手法,包括直接展示、寓意与联想、夸张与幽默等。通过对商品的折、拉、叠、挂、堆等陈列技巧,橱窗设计能够充分展现商品的形态、质地、色彩、样式等特性。同时,寓意与联想可以通过象形形式或抽象几何道具来唤起消费者的联想与共鸣,创造出强烈的时代气息和视觉空间。合理的夸张和贴切的幽默能够明显夸大商品的美的因素,给人以新颖奇特的心理感受,引起人们的笑声和思考。通过这些表现手法,橱窗设计能够有效地传达商品的个性内涵,吸引消费者的注意力。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • faceu激萌变老特效的使用方法详解
    本文介绍了faceu激萌变老特效的使用方法,包括打开faceu激萌app、点击贴纸、选择热门贴纸中的变老特效,然后对准人脸进行拍摄,即可给照片添加变老特效。操作简单,适合新用户使用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • 给定一个二叉树,要求随机选择树上的一个节点。解法:遍历树的过程中,随机选择一个节点即可。具体做法参看:从输入 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在微店中如何修改分销产品的价格以及设置价格的方法。客户在拍下商品后,在1小时内可以进行修改价格的操作,通过进入订单管理,点击未付款子项,可以找到订单信息并进行改价操作。修改价格后,买家会收到改价后的短信通知,在微店订单中进行付款即可。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
author-avatar
king
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有