论文地址:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
Pytorch代码地址:https://github.com/DeepScale/SqueezeNet
Introduction&Motivation
squeezenet:旨在保证网络模型的精度的同时,使用更少量的参数。
squeezenet减少参数量的优势:嵌入式
- 更有效率的分布式训练
- 当客户端更新模型时其开销更小
- 灵活的FPGA和嵌入式部署
Design Strategies
- 使用1x1卷积核代替3x3卷积核,参数计算量降低为原来的1/9
- 减少3x3卷积核的输入通道数
- 尽可能将下采样放在网络后面的层中,使得卷积层拥有较大的激活图。也就是说网络前边的层步长为1,超过1的步长的层集中在网络后半部分,那么网络中的许多层将具有较大的特征激活图。
策略1、2旨在减少模型的参数量。策略3旨在保证模型的精度,减少因参数量减少带来的精度下降问题。
Fire Model
定义Fire模块:
- 一个squeeze layer,只含有1x1卷积,即上面所说的策略1
- 一个expend layer,为1x1卷积和3x3卷积的组合
- fire model 中3个可调的超参数为:(squeeze layer中1∗1 filter的个数)、(expand layer中1∗1filter的个数)、(expand layer中3∗3 filter的个数)
- 令,可以减少3x3卷积核的输入通道数,即上面所说的策略2
上图为fire model的结构,
- 大小的feature map经过Squeeze layer,得到个feature map,,即为Squeeze压缩
- 大小的feature map经过到expand layer,分别经过1*1卷积层和3*3卷积层进行卷积,再将进行concat,输出为 大小feature map。
- 在fire model结构中,feature map的大小不变,只有深度变化。
- 论文提出的SqueezeNet结构中:
Squeezenet Architecture
上图,左边是SqueezeNet,中间为包含simple bypass的改进版本,右边为使用complex bypass的改进版本。
SqueezeNet:
- 以卷积层(conv1)开始,接着使用8个Fire modules (fire2-9),最后以卷积层(conv10)结束。
- 每个两个fire module中的filter数量逐渐增加,并且在conv1, fire4, fire8, 和 conv10这几层之后使用步长为2的max-pooling,即将池化层放在网络相对靠后的层,这使用了上述的策略3
conv1+max-pooling+fire-model2 :
- 224*224*3的图片
- 先经过conv1(步长为2),输出为111*111*96。
- maxpool1层的输出为55∗55∗96。
- 之后的Squeeze层有16个1∗1∗96的卷积filter,输出尺寸为55∗55∗16
- 将Squeeze层的输出分别送到expand层中的1∗1∗16(64)和3∗3∗16(64)进行处理。
- 为了得到大小相同的输出,对3∗3∗16的卷积输入进行尺寸为1的zero padding。
- 分别得到55∗55∗64和55∗55∗64大小相同的两个feature map。
- 将这两个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
........