一、背景介绍
在2012年AlexNet问世以为,卷积神经网络在图像分类识别,目标检测,图像分割等方面得到广泛应用,后续大牛们也提出了很多更优越的模型,比 如VGG, GoogLeNet系列,ResNet, DenseNet等。
伴随着精度的提升,对应模型的深度也随着增加,从AlexNet的7层,到16 层 VGG,再到GoogLeNet 的 22 层,再到 152 层 ResNet,更有上千层的 ResNet 和 DenseNet,从而带来了效率问题。因此,后面又提出来了在保持一定精度的前提下的轻量级卷积网路架构,SqueezeNet就是其中之一。
对于相同的正确率水平,轻量级的CNN架构可以提供如下的优势:
1. 在分布式训练中,与服务器通信需求更小
2. 参数更少,从云端下载模型的数据量小
3. 更适合在FPGA和嵌入式硬件设备上部署。
SqeezeNet在ImageNet上实现了和AlexNet相同的正确率,但是只使用了1/50的参数。更进一步,使用模型压缩技术,可以将SqueezeNet压缩到0.5MB,这是AlexNet的1/510。
二、SqueezeNet介绍
SqueezeNet所做的主要工作如下:
1. 提出了新的网络架构Fire Module,通过减少参数来进行模型压缩
2. 使用其它方法对提出的SqeezeNet模型进行进一步压缩
3. 对参数空间进行了探索,主要研究了压缩比和3×3卷积比例的影响
SqueezeNet中提出了 Fire Module结构作为网络的基础模块,具体结构如下图:
Fire module 由两层构成,分别是 squeeze 层+expand 层,如上图所示,squeeze 层是一个 1*1 卷积核的卷积层,expand 层是 1*1 和 3*3 卷积核的卷积层,expand 层中,把 1*1 和 3*3 得到的 feature map 进行 concat。
具体操作如下图所示:
s1 是 Squeeze层 1*1卷积核的数量, e1 是Expand层1*1卷积核的数量, e3是Expand层3*3卷积核的数量,在文中提出的 SqueezeNet 结构中,e1=e3=4s1。
SqueezeNet网络的整体结构如下图:
SqueezeNet以卷积层(conv1)开始,接着使用8个Fire modules (fire2-9),最后以卷积层(conv10)结束。每个fire module中的filter数量逐渐增加,并且在conv1, fire4, fire8, 和 conv10这几层之后使用步幅为2的最大池化。
模型具体参数情况如下图:
在Imagenet数据集上,和AlexNet对比如下图:
可以看到,在统一不使用模型压缩的情况下,模型大小相比于AlexNet,缩小了50倍,但是精度却和AlexNet一样。
三、SqueezeNet具体实现(Pytorch, Tensorflow)
1.Pytorch实现
import torch
import torch.nn as nn
from torchvision.models import squeezenet1_0
from torchvision import transforms
from PIL import Image
class Fire(nn.Module):
def __init__(self, in_channels, squeeze_channels, expand1x1_channels, expand3x3_channels):
super(Fire, self).__init__()
self.squeeze