【目标检测】轻量级网络SqueezeNet

  目标检测当前的问题:
  经典目标检测依赖于CNN作为主干进行特征提取,即backbone。一些优秀的基础网络如VGGNet、ResNet等虽然能很好的提取特征但是这些网络的计算量很大,依靠这些网络设计的物体检测模型很难达到实时性的要求,尤其是在ARM、FPGA及ASIC等计算能力有限的平台。因此要对模型进行加速。
  模型加速方法:
  (1)轻量化设计:
  模型设计时就采用轻量化的思想:
  1)采用轻量卷积方式:例深度可分离卷积、分组卷积等
  2)全局平均池化代替全连接层
  3)1×1卷积进行通道降维

  轻量化的网络设计,目前较为流行的有:
  (1)SqueezeNet:采用精心设计的压缩再扩展的结构。
  (2)MobileNet:使用效率更高的深度可分离卷积。
  (3)ShuffleNet:通道混洗操作。

  (2)BN层合并:
  BN层优点:有效的加速模型收敛,并在一定程度上防止模型过拟合。
  问题:前向传播时,BN的存在也增加了多于的计算量。
  改进:测试时由于BN层的参数已经固定,因此可以在测试时将BN层的计算合并到卷积层,从而减少计算量,实现模型加速。
  (3)网络剪枝:
  网络可以剪枝的依据:
  在卷及网络成千上万的权重中,存在大量接近0的参数,这些参数属于冗余参数,去掉后模型也可以达到形同的表达能力。
  网络剪枝方法:
  搜索网络中的冗余卷积核,将网络稀疏化,称之为网络剪枝。
  (4)权重量化:
  权重量化定义:
  将网络中高精度的参数量化为低精度的参数,从而加速计算。
  权重量化:
  高精度参数有更大的动态变化范围,能够表达更丰富的参数空间,因此在训练时通常采用32位浮点数作为网络参数的模型。训练完成后为了减小模型大小,通常可以将32位浮点数量化为16位浮点数的半精度甚至是int8整型…典型方法如Deep Compression。
  (5)张量分解:
  原始网络参数中存在大量的冗余,除了剪枝的方法,还可以使用SVD分解和PQ分解等方法,将原始张量分解为低秩的若干张量,以减少卷积的计算量,提升前向速度。
  (6)知识蒸馏:
  通常来讲,大的模型拥有更强的拟合能力和泛化能力,小的模型,拟合能力较弱,并且容易出现过拟合。
  使用大模型指导小模型的训练,保留大模型的有效信息,实现知识蒸馏。

一、 SqueezeNet:压缩再扩展

1.1 介绍

  最近关于深度卷积神经网络(CNNs)的研究主要集中在提高计算机视觉数据集的准确性上。对于给定的精度级别,通常存在多个CNN架构来达到该精度级别。给定相同的精度,参数较少的CNN架构具有以下几个优点:

  • 更高效的分布式训练:服务器之间的通信是限制分布式CNN训练可扩展性的因素。对于分布式数据并行训练,通信开销与模型中参数的数量成正比。简而言之,小模型训练更快,因为需要更少的通信。
  • 模型导出到客户端的开销更少:将模型从服务器上复制到客户端,这种做法被称为无线更新。典型的CNN/DNN模型的无线更新需要大量的数据传输。更小的模型需要更少的通信,使得频繁的更新更加可行。
  • FPGA和嵌入式部署更可行:FPGA通常只有不到10mb的片内存储器。足够小的模型可以直接存储在FPGA上,不会被内存带宽所限制。

1.2 相关工作

1.2.1 模型压缩

  模型压缩的目标:确定一个只有很少参数的模型,同时保持准确率。
  模型压缩经典方法:用一个现有的CNN模型并以有损的方式压缩它。 围绕模型压缩这一主题已经出现了一个研究社区,并且已经报道了几种方法。
  例:
  1.将奇异值分解(SVD)应用到一个预先训练好的CNN模型中。
  2.网络剪枝,从一个预先训练好的模型开始,然后将低于某一阈值的参数替换为零,形成稀疏矩阵,最后在稀疏CNN上进行几次迭代训练。
  3.Deep Compression,结合网络修剪与量化(8位或者更少)和哈夫曼编码创建的一个方法称为深度压缩,并进一步设计了一个硬件加速器EIE,直接压缩模型。
  SqueezeNet模型压缩方法:与经典的方式不同,它调整CNN架构达到压缩的目的。

1.2.2 CNN 微/宏 架构

  (1)CNN微架构:
  随着设计深度CNNs的趋势,为每一层手动选择过滤器尺寸变得很麻烦。为了解决这一问题,提出了由特定固定组织的多个卷积层组成的各种更高层次的构建块或模块。
  例:GoogLeNet提出了Inception模块,它由许多不同维度的过滤器组成,通常包括1x1和3x3,有时加上5x5,有时加上1x3和3x1 。然后,许多这样的模块被组合在一起,可能还附加了一些特别的层,以形成一个完整的网络。
  使用术语CNN微架构来表示单个模块的特定组织和维度。
  (2)CNN宏观架构
  CNN宏架构定义为多个模块的系统级组织,即多个微架构或层之间系统的组织,从而形成端到端的CNN体系结构。
  以往:CNN宏观架构中被广泛研究的话题是网络的深度。
  新兴:跨多层或模块连接的是CNN宏观架构研究的一个新兴领域。ResNet和Highway network都提出使用跨多层的连接,称为旁路连接。通过旁路连接增加了网络的精度。

1.3 SqueezeNet

  在本节
  (1)概述设计策略,这策略使得模型参数减少,同时保持精度。
  (2)介绍Fire模块,这是本文构建的CNN微架构新模块。
  (3)利用设计策略和fire模块构建SqueezeNet

1.3.1 设计策略

  策略1:用1x1过滤器替换3x3过滤器。
  给定一定数量的卷积滤波器的预算,选择使这些滤波器中的大多数为1x1,因为一个1x1滤波器的参数比一个3x3滤波器少9倍。
  策略2:减少输入通道的数量。
  一个完全由3x3滤波器组成的卷积层。该层的参数总数为(输入通道数)(滤波器数)(3*3)。因此为了在CNN中保持一个小的参数总数,还要减少3x3滤波器的输入通道的数量。方法:使用压缩层将输入通道的数量减少到3x3个。
  策略3:延迟下采样(网络后期下采样),这样网络大部分卷积层就有了大的激活图。
  在卷积网络中,卷积层生成的输出激活图 的高度和宽度由以下因素控制:
  (1)输入数据的大小,
  (2)CNN架构中采样的程度。如果网络的早期3层有大的采样步长stride,那么网络的大多数层将有小的激活图。相反,如果网络中大于1的步长集中在网络的末端,则网络中的许多层将具有较大的激活映射。
  在其他条件相同的情况下,大的激活图(由于延迟下采样)可以导致更高的分类精度。因此采取延迟下采样的策略可以尽可能提高精度。

1.3.2 fire 模块

  Fire模块:包含一个压缩层(只有1x1滤波器),一个扩展层,扩展层混合有1x1和3x3的卷积滤波器;

        在这里插入图片描述
  (1)SqueezeNet层:首先使用1×1卷积进行降维,特征图的尺寸不变这里的S1小于M,达到了压缩的目的。
  (2)Expand层:并行地使用1×1卷积与3×3卷积获得不同感受野的特征
  (3)Concat:对得到的两个特征图进行通道拼接,作为最终输出图,有点类似Inception模块,达到扩展的目的。
  Fire模块中有3个可调维(超参数):
  s1x1:压缩层中过滤器的数量(全部为1x1);
  e1x1:扩展层中1x1过滤器的数量;
  e3x3:扩展层中3x3过滤器的数量。

  Fire模块的s1x1设置为小于(e1x1+ e3x3)的数,这样压缩层能够将输入通道的数量限制在3x3过滤器上。

#fire 模块的pytorch实现
import torch
from torch import nn
class Fire(nn.Module):
    def __init__(self, inplanes, squeeze_planes, expand_planes):
        super(Fire, self).__init__()
        # 这里的squeeze_planes为S1,即压缩层中1X1卷积核的数量
        self.conv1 = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1, stride=1)
        self.bn1 = nn.BatchNorm2d(squeeze_planes)
        self.relu1 = nn.ReLU(inplace=True)
        # expand_planes为e1和e2
        self.conv2 = nn.Conv2d(squeeze_planes, expand_planes, kernel_size=1,stride=1)
        self.bn2 = nn.BatchNorm2d(expand_planes)
        self.conv3 = nn.Conv2d(squeeze_planes, expand_planes, kernel_size=3,stride=1, padding=1)
        self.bn3 = nn.BatchNorm2d(expand_planes)
        self.relu2 = nn.ReLU(inplace=True)
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)
        out1 = self.conv2(x)
        out1 = self.bn2(out1)
        out2 = self.conv3(x)
        out2 = self.bn3(out2)
        # 对两个分支的输出进行Concat处理
        out = torch.cat([out1, out2], 1)
        out = self.relu2(out)
        return out

1.3.3 SqueezeNet架构

  SqueezeNet CNN架构细节:
  (1)SqueezeNet从一个独立的卷积层(conv1)开始,然后是8个Fire模块(fire2-9),最后是一个conv层(conv10)。
  (2)从网络的开始到结束,逐渐增加每个fire模块的卷积核数量。
  (3)在conv1、fire4、fire8和conv10层之后,SqueezeNet以2的步长执行最大池,对应于策略3的延迟下采样策略。

在这里插入图片描述

                        

    在这里插入图片描述
  SqueezeNet细节:

  • 为了使1x1和3x3滤波器的输出激活具有相同的高度和宽度,我们在扩展模块的3x3滤波器的输入数据中添加了一个填充0的1像素边界。
  • ReLU激活函数应用在压缩层和扩展层之间。
  • 在fire9模块后应用Dropout,比例为50%。
  • SqueezeNet不使用全连接层,这个设计选择的灵感来自NiN 。
  • 训练SqueezeNet时,以0.04的学习率开始,并在整个训练过程中线性降低学习率。
  • Caffe框架本身不支持包含多个分辨率滤波器(如1x1和3x3)的卷积层。为了解决这个问题,使用两个独立的卷积层来实现扩展层:一个带有1x1滤波器的层,和一个带有3x3滤波器的层。然后,在通道维中将这些层的输出连接在一起

1.4 评价SqueezeNet

  CNN模型压缩,目标都是压缩一个AlexNet 模型,该模型经过训练,使用ImageNet数据集对图像进行分类。因此,在评估SqueezeNet时,使用AlexNet和相关的压缩模型结果作为比较的基础。
在这里插入图片描述
  (1)同其他压缩模型的对比,表2:
  1.基于SVD的方法:能够将预训练的AlexNet模型压缩5倍,同时将top-1的精度降低到56.0% 。
  2.网络修剪:在保持ImageNet前1位57.2%和前5位80.3%的基线的同时,模型大小减少了9倍。
  3.深度压缩(deep compression):模型尺寸减少了35倍,同时仍保持基线精度水平。
  4.SqueezeNet:模型尺寸减少了50倍,同时达到或超过了AlexNet的top 1和top 5的精度。
  (2)小模型是否可以压缩?
  1.SqueezeNet结合深度压缩使用33%的稀疏和8位量化:产生了一个0.66 MB的模型(比32位的AlexNet小363×),其精度与AlexNet相当。
  2.SqueezeNet结合深度压缩使用33%的稀疏和6位量化:产生了0.47MB的模型(510×小于32位AlexNet)具有同等的精度。
  这表明小模型确实经得起压缩。
  (3)深度压缩(Deep compression):
  1.Deep compression深度压缩不仅在具有许多参数(如AlexNet和VGG)的CNN架构上工作良好,而且还能够压缩已经压缩的全卷SqueezeNet架构。通过将SqueezeNet与最先进的压缩技术(Deep compression)相结合,实现了模型尺寸的510倍缩小,与基线相比,准确性没有降低。
  2.深度压缩使用codebook作为其将CNN参数量化到6位或8位精度的方案的一部分。在大多数普通处理器上,这种量化操作不是一件容易的事情,因此开发了定制的硬件—高效推理引擎(EIE)—可以更有效地计算编码本量化的CNN 。

1.5 CNN微架构设计空间探索

  将架构探索分为两个主要主题:微架构探索(每个模块层的维度和配置)和宏架构探索(模块和其他层的高级端到端组织)。
  在 本节中目标并不是在每个实验中最大化准确性,而是理解CNN微架构选择对模型大小和准确性的影响。

1.5.1 微架构的元参数

  为了对类SqueezeNet架构的设计空间进行全面的介绍,定义了一组更高级别的元参数,它们控制CNN中所有fire模块的尺寸:
  (1)basee:第一个Fire模块中扩展层卷积核的数量。
  (2)ei:后续fire模块中扩展层数量
                  在这里插入图片描述

  (3)pct3x3:扩展层中3×3卷积核的比例。该参数在所有fire 模块中共享,取值范围为[0,1]。
  (4)挤压比率(SR):SR在所有fire模块共享。
  (5)Si,1×1:压缩层中1×1卷积核的数量。
                  在这里插入图片描述

  具体来说,SqueezeNet有以下元参数:basee= 128, incre= 128, pct3x3= 0.5, f req = 2, SR = 0.125。

1.5.2 压缩比

  对应策略1:通过压缩层来减少3x3滤波器看接受到的输入通道的数量,从而减少参数的数量。压缩比(SR)定义为压缩层中的过滤器数量与扩展层中的过滤器数量之比。
  实验证明:压缩比对模型尺寸和精度有的影响。
  与在SqueezeNet中一样,实验使用以下元参数:basee= 128, incre= 128, pct3x3= 0.5, freq = 2。训练多个模型,每个模型在[0.125,1.0]范围内具有不同的挤压比(SR)。
              在这里插入图片描述
  图中SqueezeNet为SR=0.125点。当SR超过0.125时,可以进一步提高ImageNet top-5的准确率,设置SR=1.0将进一步增加模型大小,但不会提高精度。

1.5.3 1×1和3×3卷积核的比例

  策略一:提出减少CNN中参数的数量,将一些3X3的滤波器替换为1X1的滤波器。在这里试图阐明1x1和3x3滤波器的比例如何影响模型的大小和精度。
  在本实验中,使用以下元参数:basee= incre= 128, f req = 2, SR = 0.500, pct3x3的变化范围从1%到99%。实验结果如图所示。实验证明:1×1卷积核和3×3卷积核的比例对模型的尺寸和精度有影响。
              在这里插入图片描述

1.6 CNN宏架构设计空间探索

  探讨在宏观架构层面上有关fire模块之间的高层连接的设计决策。
            在这里插入图片描述
  探索了三种不同的架构:

  • (1)Vanilla SqueezeNet(如前所述)。
  • (2)具有简单旁路连接的SqueezeNet
      在Fire模块3、5、7和9周围增加了旁路连接,要求这些模块学习输入和输出之间的剩余功能。与ResNet一样,为了实现围绕Fire3模块的旁路连接,将Fire4模块的输入设置为(Fire2的输出+ Fire3的输出)。
      简单边路连接有一个限制是,输入通道的数量和输出通道的数量必须相同。因此,只有一半的fire模块可以有简单的旁路连接,如上图的中间图所示。
  • (3)具有复杂旁路连接的SqueezeNet。
      简单边路连接要求fire模块的输入通道的数量和输出通道的数量必须相同
      有些模块不能满足“相同数量的通道”的要求时,使用一个复杂的旁路连接,如上图的右侧所示。复杂的旁路连接包括一个1x1卷积层,其卷积核的数量等于需要的输出通道的数量。复杂的旁路连接会向模型添加额外的参数,而简单的旁路连接则不会。

  注意:
  旁路连接除了改变正则化之外,添加旁路连接将有助于缓解由压缩层引入的代表性瓶颈。在SqueezeNet中,挤压比(SR)为0.125,这意味着每一个压缩层的输出通道比相应的扩展层少8倍。由于压缩层严重的维数(通道数)减少,使得信息通过压缩层的数量有限。通过向SqueezeNet添加旁路连接,为信息在压缩层周围的流动开辟了新道路。
  实验表明复杂的和简单的旁路连接都产生了比vanilla SqueezeNet架构的精度改进。有趣的是,简单旁路比复杂旁路具有更高的准确性。
      在这里插入图片描述

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值