SqueezeNet学习笔记

论文地址:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size

Pytorch代码地址:https://github.com/DeepScale/SqueezeNet


Introduction&Motivation

squeezenet:旨在保证网络模型的精度的同时,使用更少量的参数。

squeezenet减少参数量的优势:嵌入式

  1. 更有效率的分布式训练
  2. 当客户端更新模型时其开销更小
  3. 灵活的FPGA和嵌入式部署

Design Strategies

  1. 使用1x1卷积核代替3x3卷积核,参数计算量降低为原来的1/9
  2. 减少3x3卷积核的输入通道数
  3. 尽可能将下采样放在网络后面的层中,使得卷积层拥有较大的激活图。也就是说网络前边的层步长为1,超过1的步长的层集中在网络后半部分,那么网络中的许多层将具有较大的特征激活图。

策略1、2旨在减少模型的参数量。策略3旨在保证模型的精度,减少因参数量减少带来的精度下降问题。


Fire Model

SqueezeNet学习笔记_第1张图片

定义Fire模块:

  1. 一个squeeze layer,只含有1x1卷积,即上面所说的策略1
  2. 一个expend layer,为1x1卷积和3x3卷积的组合
  3. fire model 中3个可调的超参数为:s_{1x1}(squeeze layer中1∗1 filter的个数)、e_{1x1}(expand layer中1∗1filter的个数)、e_{3x3}(expand layer中3∗3 filter的个数)
  4. s_{1x1} < e_{1x1}+e_{3x3},可以减少3x3卷积核的输入通道数,即上面所说的策略2

SqueezeNet学习笔记_第2张图片

上图为fire model的结构,

  1. H*W*M大小的feature map经过Squeeze layer,得到S_{1}个feature map,S_{1}<M,即为Squeeze压缩
  2. H*W*S_{1}大小的feature map经过到expand layer,分别经过1*1卷积层和3*3卷积层进行卷积,再将进行concat,输出为H*W*(e_{1}+e_{3}) 大小feature map。
  3. 在fire model结构中,feature map的大小不变,只有深度变化。
  4. 论文提出的SqueezeNet结构中:e_{1}=e_{3}=4*S_{1} 

Squeezenet Architecture

SqueezeNet学习笔记_第3张图片

上图,左边是SqueezeNet,中间为包含simple bypass的改进版本,右边为使用complex bypass的改进版本。

SqueezeNet:

  • 以卷积层(conv1)开始,接着使用8个Fire modules (fire2-9),最后以卷积层(conv10)结束。
  • 每个两个fire module中的filter数量逐渐增加,并且在conv1, fire4, fire8, 和 conv10这几层之后使用步长为2的max-pooling,即将池化层放在网络相对靠后的层,这使用了上述的策略3
     

SqueezeNet学习笔记_第4张图片

conv1+max-pooling+fire-model2 :

  1. 224*224*3的图片
  2. 先经过conv1(步长为2),输出为111*111*96。
  3. maxpool1层的输出为55∗55∗96。
  4. 之后的Squeeze层有16个1∗1∗96的卷积filter,输出尺寸为55∗55∗16
  5. 将Squeeze层的输出分别送到expand层中的1∗1∗16(64)和3∗3∗16(64)进行处理。
  6. 为了得到大小相同的输出,对3∗3∗16的卷积输入进行尺寸为1的zero padding。
  7. 分别得到55∗55∗64和55∗55∗64大小相同的两个feature map。
  8. 将这两个feature map连接(concate)到一起得到55∗55∗128大小的feature map。

考虑到bias参数,这里的参数总数为: 
(1∗1∗96+1)∗16+(1∗1∗16+1)∗64+(3∗3∗16+1)∗64=(1552+1088+9280)=11920

Squeeze层由于使用1∗11∗1卷积压缩了参数数量,并且进行了降维操作,但是对应的代价是输出特征图的通道数(维数)也大大减少。

expand层使用不同尺寸的卷积模板来提取特征,进行了升维操作同时将两个输出连接到一起。

但是3∗3的卷积参数远超1∗1卷积的参数,对减少参数十分不利,所以作者又针对3∗3卷积进行了剪枝操作以减少参数数量。

从网络整体来看,feature map的尺寸不断减小,通道数不断增加,最后使用平均池化将输出转换成1∗1∗1000完成分类任务。


Squeezenet Detials

  • 为了使 1∗1和 3∗3 卷进输出的结果又相同的尺寸,在expand modules中,3∗3卷积进行尺寸为1的zero padding。 
  • squeeze layers和 expand layers中都是用ReLU作为激活函数 
  • 在fire9 module之后,使用Dropout,比例取50% 
  • 注意到SqueezeNet中没有全连接层,大大减少参数量
  • 训练过程中,初始学习率设置为0.04,在训练过程中线性降低学习率。
  • 由于Caffee中不支持使用两个不同尺寸的filter,在expand layer中实际上是使用了两个单独的卷积层(1∗11∗1 filter 和 3∗33∗3 filter),最后将这两层的输出连接在一起,这在数值上等价于使用单层但是包含两个不同尺寸的filter。 

Code

........

你可能感兴趣的:(SqueezeNet学习笔记)