https://www.jianshu.com/p/f9b015cc4514
https://github.com/hpi-xnor/BMXNet BMXNet:基于MXNet的开源二值神经网络实现
神经网络模型的压缩是一个很有前景的方向。由于神经网络需要较大的计算量,目前来说,我们通常在服务器上对神经网络进行训练或是计算的。移动端的神经网络在断网的情况下就失去了作用。通过一些压缩神经网络的方法,我们能够缩小神经网络的规模,并且提高计算速度。这对于实现移动端人工智能来说很有意义。
本文基于< XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks>介绍了神经网络模型压缩的一些相关工作,以及二值化卷积神经网络BWN,还有XNOR-Net的工作原理。XNOR-Net的实现代码:[此处应有链接,等我写完初步的demo将会上传]。(由于Tensorflow暂时不支持bit操作,所以代码只作为研究用,并不能真正实现bit操作。)
Binary Neural Networks由Bengio团队在< BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1 >一文中提出。
其原理很简单:
可知B = Sign(W), alpha=L1norm(W)/n. 其中n=cwh,c,w,h分布为kernel的输入通道数,宽,高。
可以通过以下算法对网络进行训练:
值得注意的是,我们在前向计算时使用B和alpha,而在后向传播时使用实数W进行参数更新。这是由于梯度的量级通常很小,直接对B进行更新时,求导后值为0。
在网络中加入Batch Normalization可以提升网络性能。
XNOR-Net与BWN不同的地方在于,XNOR-Net不仅将kernel进行二值化,还将input二值化。
由于证明过程与BWN相似,在这里不进行累述。
XNOR-Net的block表示如上图。
总的来说,神经网络压缩是一个很有前景的方向。目前存在的问题主要是精度损失的问题。文章中将AlexNet进行压缩后,精度损失了2.9%,这对于某些任务来说是不可接受的。其次在于现在很多硬件没有成熟的二值运算。
未来我可能会开源一个基于Tensorflow的神经网络压缩的代码。由于目前Tensorflow底层代码没有支持二值运算,所以里面使用的实际上还是浮点数。因此只能作为研究或者提取训练好的参数到其他平台。
Neural Networks compression系列文章包括:
原文:https://www.cnblogs.com/jukan/p/10930171.html