• XNORNet: ImageNet Classification Using Binary Convolutional Neural Networks


    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!

    COMPUTER VISION - ECCV 2016, PT IV, (2016): 525-542

    Abstract

      我们提出了标准卷积神经网络的两种有效近似:二值权重网络和XNOR网络。在二值权重网络中,滤波器使用二值近似,从而节省32倍的内存。在XNOR网络中,滤波器和卷积层的输入都是二值的。XNOR网络主要使用二值运算来近似卷积。这导致58倍快的卷积运算和 32倍的内存节省。 XNOR网络提供了在CPU(而不是GPU)上实时运行最先进网络的可能性。我们的二值网络简单、准确、高效,可以处理具有挑战性的视觉任务。我们在ImageNet分类任务上评估我们的方法。使用二值权重网络版本的AlexNet的分类准确度仅比全精度AlexNet (top-1测量)低2.9%。我们将我们的方法与最近的网络二值化方法BinaryConnect 和BinaryNets进行比较,并在ImageNet上大大优于这些方法,在top-1准确度上超过16%。

    Keywords: Binary Convolution, Deep Learning, Convolutional Neural Network, Binary Neural Networks, Binary Deep Learning

    1 Introduction

      深度神经网络(DNN)在包括计算机视觉和语音识别在内的多个应用领域显示出显著的改进。在计算机视觉中,一种特殊类型的DNN,称为卷积神经网络(CNN),已经在目标识别[1,2,3,4]和检测[5,6,7]方面展示了最先进的结果。

      卷积神经网络在目标识别和检测方面显示出可靠的结果,这在现实世界的应用中很有用。在识别方面取得最新进展的同时,虚拟现实(Oculus的VR)[8]、增强现实(HoloLens的AR)[9]和智能可穿戴设备也在发生有趣的进步。将这两部分放在一起,我们认为现在是为智能便携式设备配备最先进识别系统功能的正确时机。然而,基于CNN的识别系统需要大量的内存和计算能力。虽然它们在昂贵的基于GPU的机器上表现良好,但它们通常不适合手机和嵌入式电子设备等小型设备。

      例如,AlexNet[1]有61M参数(249MB内存)并执行1.5B高精度操作来对一张图像进行分类。对于更深的CNN,例如VGG [2](参见第4.1节),这些数字甚至更高。这些模型很快超过了手机等小型设备的有限存储、电池电量和计算能力。

      在本文中,我们通过对权重甚至卷积神经网络中的中间表征进行二值化,为CNN引入了简单、高效和准确的近似。我们的二值化方法旨在使用二值运算找到卷积的最佳近似值。我们证明了我们对神经网络进行二值化的方法产生的ImageNet分类准确度数可与标准全精度网络相媲美,同时需要显着更少的内存和更少的浮点运算。

      我们研究了两种近似:具有二值权重的神经网络和XNOR网络。在二值权重网络中,所有权重值都用二值近似。具有二值权重的卷积神经网络明显小于具有单精度权重值的等效网络(32)。另外,当权重值是二值时,卷积可以只通过加减法(没有乘法)来估计,导致2倍的加速。大型CNN的二值权重近似可以适应小型便携式设备的内存,同时保持相同水平的准确度(参见第4.1和4.2节)。

      为了进一步推进这个想法,我们引入了XNOR网络,其中卷积层和全连接层的权重和输入都近似为二值1。二值权重和二值输入允许一种有效的方式来实现卷积运算。如果卷积的所有操作数都是二值的,则可以通过XNOR和位计数操作[11]来估计卷积。XNOR网络可以准确逼近CNN,同时在CPU中提供58倍的加速。这意味着XNOR网络可以在内存小且没有GPU的设备中实现实时推理(XNOR网络中的推理可以在CPU上非常有效地完成)。

      据我们所知,本文是首次尝试在ImageNet等大规模数据集上对二值神经网络进行评估。我们的实验结果表明,我们提出的卷积神经网络二值化方法在ImageNet挑战ILSVRC2012中的top-1图像分类上大大优于[11]的最先进的网络二值化方法(16.3%)。我们的贡献有两个:首先,我们引入了一种在卷积神经网络中对权重值进行二值化的新方法,并展示了我们的解决方案与最先进的解决方案相比的优势。其次,我们介绍了XNOR网络,这是一种具有二值权重和二值输入的深度神经网络模型,并表明与标准网络相比,XNOR网络可以获得相似的分类精度,同时显著提高效率。

    1 全连接层可以通过卷积实现,因此,在本文的其余部分,我们也将它们称为卷积层[10]。

    2 Related Work

    3 Binary Convolutional Neural Network

      我们用三元组表示一个L层CNN架构。是一组张量,其中每个元素是CNN第 l 层的输入张量(图1中的绿色立方体)。W是一组张量,其中这个集合中的每个元素W = 是CNN第 l 层中的第 k 个权重过滤器。Kl 是CNN第 l 层中权重滤波器的数量。表示以 I 和 W 作为其操作数的卷积运算。2 ,其中(c, win, hin)分别表示通道、宽度和高度。,其中w ≤ win,h ≤ hin。我们提出了二值CNN的两种变体:二值权重,其中W的元素是二值张量和XNOR网络,其中 I 和 W 的元素都是二值张量。

    3.1 Binary-Weight-Networks

    Training Binary-Weights-Networks: 训练CNN的每次迭代都涉及三个步骤;前向传递、后向传递和参数更新。为了训练具有二值权重的CNN(在卷积层中),我们仅在前向传播和反向传播期间对权重进行二值化。为了更新参数,我们使用高精度(实值)权重。因为,梯度下降时参数变化很小,更新参数后的二值化忽略了这些变化,无法提高训练目标。[11,38]也采用这种策略来训练二值网络。

      算法1展示了我们用二值权重训练CNN的过程。首先,我们通过计算B和A对每一层的权重滤波器进行二值化。然后我们使用二值权重及其相应的缩放因子调用前向传播,其中所有的卷积操作都由公式1进行。然后,我们称为反向传播,其中梯度是相对于估计的权重滤波器计算的。最后,参数和学习率通过更新规则进行更新,例如使用动量的SGD更新或ADAM [42]。

      训练完成后,无需保留实值权重。因为,在推理时,我们只使用二值化权重执行前向传播。

    3.2 XNOR-Networks

      到目前为止,我们设法找到了二值权重和比例因子来估计实值权重。卷积层的输入仍然是实值张量。现在,我们将解释如何对权重和输入进行二值化,以便可以使用XNOR和位计数操作有效地实现卷积。这是我们XNOR网络的关键要素。为了约束卷积神经网络要具有二值权重和二值输入,我们需要在卷积运算的每个步骤中强制执行二值操作数。卷积由重复移位操作和点积组成。移位操作在输入上移动权重滤波器,点积在权重滤波器的值和输入的相应部分之间执行逐元素乘法。如果我们用二值运算来表示点积,卷积可以用二值运算来近似。两个二值向量之间的点积可以通过XNOR-Bitcounting操作[11]来实现。在本节中,我们将解释如何通过{+1, -1}n中两个向量之间的点积来近似Rn中两个向量之间的点积。接下来,我们将演示如何使用这种近似来估计两个张量之间的卷积运算。

    Training XNOR-Networks: CNN中的一个典型块包含几个不同的层。图3(左)说明了CNN中的一个典型块。该块按以下顺序有四层:1-卷积、2-批归一化、3-激活和4-池化。批归一化层[43]通过均值和方差对输入批次进行归一化。激活是逐元素的非线性函数(例如,Sigmoid、ReLU)。池化层对输入批应用任何类型的池化(例如,最大值、最小值或平均值)。对二值输入应用池化会导致大量信息丢失。例如,二值输入的最大池化返回一个张量,其大部分元素都等于+1。因此,我们将池化层放在卷积之后。为了进一步减少由于二值化造成的信息损失,我们在二值化之前对输入进行归一化。这确保了数据保持零均值,因此,零阈值导致更少的量化误差。二值CNN块中的层顺序如图3(右)所示。

      二值激活层(BinActiv)计算 K 和符号(I),如第3.2节所述。为了计算符号函数q = sign(r)的梯度,我们采用与[11]相同的方法,其中gr = gq1|r|≤1。在下一层(BinConv),给定 K 和sign(I),我们通过公式11计算二值卷积。然后在最后一层(Pool),我们应用池化操作。我们可以插入一个非二值激活(例如,ReLU)在二值卷积之后。这有助于我们使用最先进的网络(例如AlexNet或VGG)。

      一旦我们有了二值CNN结构,训练算法将与算法1相同。

    4 Experiments

    4.1 Efficiency Analysis

    4.2 Image Classification on ILSVRC2012

    4.3 Ablation Studies

    5 Conclusion

  • 相关阅读:
    游戏类型
    cocos2d-x lua 一些语法
    lua中ipairs和pairs
    lua的一些语法
    误删jre怎么办
    右键android工程的包名选择Build Path后怎么还原
    播放Armature动画
    接入第三方sdk出现了一些问题总结
    gettimeofday() 获取系统时间,精确到微秒 这个似乎只能在linux 下用,不能在windows 下用
    windows timeGetTime() 函数 获取系统从开机到现在的毫秒时间值
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/16055877.html
Copyright © 2020-2023  润新知