XNOR-Net算法详解
XNOR-Net是YOLO的作者作为三作提出的面向计算资源不足的设备如MR眼镜、手机等提出的二进制网络。整篇论文分为两个部分:
1.将卷积核二值化(+1,-1)的Binary-Weight-Networks;
2.将输入与卷积核都二值化的XNOR-Net。
网络的整体是采用经典的LeNet,利用卷积、池化、全连接和参数共享等方式得到了参数少的分类网络。详解请参考(https://blog.csdn.net/daydayup_668819/article/details/79932548)。
这里是论文地址。(https://arxiv.org/abs/1603.05279)
这里是作者提供的开源代码地址。(https://github.com/allenai/XNOR-Net)
这里是基于pytorch版本的可供cpu测试的XNOR-Net开源代码地址。[(https://github.com/cooooorn/Pytorch-XNOR-Net)
Binary-Weight-Networks
文章中提到了关于将卷积核二进制化的推导过程。这里只介绍思想,具体公式请参照论文。论文的核心思想是将原有的卷积核的参数利用一个二进制的卷积核与系数的乘积来代替。经作者推导,二进制卷积核的值与对应位置的原卷积核处值的符号相同。例如原卷积核处值为-0.3,则对应二进制卷积核值应为-1。但是在网络训练参数更新时仍然采用原卷积核的值便于训练。Binary-Weight-Networks对精度影响较小,因为卷积核二值化后将原有的乘积计算更改为加减计算,节省2倍的计算资源和32倍的存储资源。
XNOR-Net
类似于上述过程,文章提出了将网络的输入同样二值化的思想,二值化的输入类似于上述,与对应位置的输入的符号相同,但是输入得系数矩阵是直接整体取得均值,而不是按channel取二值,这样会提高计算效率。XNOR-Net由于将输入与卷积核同时进行了二值化,原有网络的卷积计算可以变为异或计算,大大提高了计算速度,节省56倍计算资源与32倍存储资源。但由于输入精度与卷积核精度的损失,计算精度同样降低的约12%。
整体训练
在训练过程中,前向传播与反向传播都采用的是二值化的计算,但是在更新参数时采用原浮点型的参数。与传统网络不同,二进制采取了不同的网络顺序。经典网络结构是卷积-BN-ACTIV-POOL,二进制网络采取的是BN-BIN ACTIV-BIN CONV-POOL,减小了Pooling带来的损失。另外作者提供了多进制量化的公式:
网络整体计算高效,精度有所牺牲。
[1]:Mohammad Rastegari, Vicente Ordonez, Joseph Redmon,等. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks[C]// European Conference on Computer Vision. Springer International Publishing, 2016.