XNOR-Net:二值化卷积神经网络
https://www.jianshu.com/p/f9b015cc4514
https://github.com/hpi-xnor/BMXNet BMXNet:基于MXNet的开源二值神经网络实现
Index
- Introduction
- Related Works
- Binary Neural Networks
- XNOR-Net
- Conclusion
Introduction
神经网络模型的压缩是一个很有前景的方向。由于神经网络需要较大的计算量,目前来说,我们通常在服务器上对神经网络进行训练或是计算的。移动端的神经网络在断网的情况下就失去了作用。通过一些压缩神经网络的方法,我们能够缩小神经网络的规模,并且提高计算速度。这对于实现移动端人工智能来说很有意义。
本文基于< XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks>介绍了神经网络模型压缩的一些相关工作,以及二值化卷积神经网络BWN,还有XNOR-Net的工作原理。XNOR-Net的实现代码:[此处应有链接,等我写完初步的demo将会上传]。(由于Tensorflow暂时不支持bit操作,所以代码只作为研究用,并不能真正实现bit操作。)
Related Works
- Shallow Networks浅层网络:用更浅的网络来表示训练好的网络。很多时候,神经网络会存在冗余的参数和层数,这个方法通过使用更浅的网络,达到相同的效果,减少参数加快计算。
- Compressing pre-trained networks压缩训练好的模型:Deep Compression就是这样的方法。通过对模型参数进行剪枝,量化,哈夫曼编码等技巧,能够压缩模型。关于Deep Compression的介绍可以看我前几篇文章(文末有链接)。
- Designing compact layers设计更简洁层: Residual layers就是一种压缩的手段。
- Quantizing parameters量化参数:目前浮点数通常使用32bit表示,量化可以用更少的位数来表示参数,但是会损失一定精度。
- Network binarization网络二值化:二值化是将网络完全使用+1, -1来表示,这样就可以用1bit来表示网络。Binary Weight Network 和XNOR-Net都是二值化的网络。网络二值化后,卷积可以表示为简单的加法减法,且可以大大减小计算时间。
Binary Neural Networks
Binary Neural Networks由Bengio团队在< BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1 >一文中提出。
其原理很简单:

其中I为Input输入,W为weight,B为二值化的weight,alpha为缩放因子。
由上式可知,一个kernel对输入进行卷积的结果,可以由二值化的weight对输入进行⊕后,再乘缩放因子得到。其中⊕表示没有乘法的卷积运算。
证明:

由上式可知,J最小时,alpha和B有最优值。
展开一式:

令c = WTW, n=BTB,得到:

易得alpha和B的最优解:


可知B = Sign(W), alpha=L1norm(W)/n. 其中n=cwh,c,w,h分布为kernel的输入通道数,宽,高。
可以通过以下算法对网络进行训练:

值得注意的是,我们在前向计算时使用B和alpha,而在后向传播时使用实数W进行参数更新。这是由于梯度的量级通常很小,直接对B进行更新时,求导后值为0。
在网络中加入Batch Normalization可以提升网络性能。
XNOR-Net
XNOR-Net与BWN不同的地方在于,XNOR-Net不仅将kernel进行二值化,还将input二值化。
由于证明过程与BWN相似,在这里不进行累述。

如上图,将输入进行二值化时,由于计算L1norm时存在很多冗余的计算,XNOR-Net采用了更有效的方式:将输入在channel维度计算norm得到A,用k(k为wh大小的卷积核,其值为1/wh)对A进行卷积得到K。
之后只需要将Sign(I)与Sign(W)进行卷积,再乘K和alpha即可。
由于Sign(I)和Sign(W)都是二值化的,卷积可以通过XNOR和bit-count表示。

XNOR-Net的block表示如上图。
Conclusion
总的来说,神经网络压缩是一个很有前景的方向。目前存在的问题主要是精度损失的问题。文章中将AlexNet进行压缩后,精度损失了2.9%,这对于某些任务来说是不可接受的。其次在于现在很多硬件没有成熟的二值运算。
未来我可能会开源一个基于Tensorflow的神经网络压缩的代码。由于目前Tensorflow底层代码没有支持二值运算,所以里面使用的实际上还是浮点数。因此只能作为研究或者提取训练好的参数到其他平台。
Neural Networks compression系列文章包括:
- 漫谈Deep Compression
- XNOR-Net:二值化卷积神经网络
作者:Efackw13
链接:https://www.jianshu.com/p/f9b015cc4514
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
XNOR-Net:二值化卷积神经网络的更多相关文章
- 二值化神经网络(BNN)基础学习(一)
目录 1.简介 2.优点 3.基本原理 3.1 权重和激活值二值化[3] 3.2 乘法优化 3.3 权重和激活值更新 4.结论[3] 参考资料 1.简介 二值化神经网络,在浮点型(权重值和激活函数 ...
- Opencv实现图像的灰度处理,二值化,阀值选择
前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...
- 深度学习实践-强化学习-bird游戏 1.np.stack(表示进行拼接操作) 2.cv2.resize(进行图像的压缩操作) 3.cv2.cvtColor(进行图片颜色的转换) 4.cv2.threshold(进行图片的二值化操作) 5.random.sample(样本的随机抽取)
1. np.stack((x_t, x_t, x_t, x_t), axis=2) 将图片进行串接的操作,使得图片的维度为[80, 80, 4] 参数说明: (x_t, x_t, x_t, x_t) ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- opencv二值化处理
#include "stdafx.h"//对一张图片进行二值化处理 IplImage *pSrclmg =NULL;//载入的图片IplImage *pDeclmg =NULL;/ ...
- [iOS OpenCV的使用,灰度和二值化]
看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使 ...
- java 图像灰度化与二值化
转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...
- OpenCV图像的二值化
图像的二值化: 与边缘检测相比,轮廓检测有时能更好的反映图像的内容.而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出 ...
- OpenCV中对图像进行二值化的关键函数——cvThreshold()。
函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, doub ...
随机推荐
- SuperMap iServer之CAS单点登陆搭建流程
一.安装CAS 1.环境准备 cas-server-3.5.2-release.zip apache-tomcat-7.0.42.zip supermap_iserver_8.1.1a 2.安装CAS ...
- MySQL修炼之路三
1. SQL查询 1. 执行顺序 3. select ... 聚合函数 from 表名 1. where ... 2. group by ... 4. having ... 5. order by . ...
- 肖哥HCNP-正式篇笔记
21.网工学习环境准备. 一. 关掉所有杀毒软件及管家如阿健. 二. 安装环回网卡 (一定要先安装.) 1. 计算机设备管理 2. 在右侧最上端计算机名上方右键,点击过时硬件. 3. 下一步.手动选择 ...
- Python模块(导入,内置,自定义,开源)
目录: 模块介绍 自定义模块 内置模块 开源模块 一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用p ...
- 51nod 1115 最大M子段和 V3
环形最大M子段和,N个整数组成的序列排成一个环,a[1],a[2],a[3],…,a[n](a[n-1], a[n], a[1]也可以算作1段),将这N个数划分为互不相交的M个子段,并且这M个子段的和 ...
- Thinkphp3.2下导入所需的类库 同java的Import 本函数有缓存功能
* 导入所需的类库 同java的Import 本函数有缓存功能 * @param string $class 类库命名空间字符串 * @param string $baseUrl 起始路径 * @pa ...
- 关于input标签checkbox属性 和checked
我们设置了type的属性为checkbox时,记住以下3个关键点 1.点勾选时或者说点击时,checked为选中,在input标签中是checked=“checked”,注意这里面无论checked= ...
- Spring源码窥探之:@Profile
Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...
- Dynamics 365 On-premises和Online 的不同
1.新建账号的不同:on-premises(下文简称op)是和ad绑定的,所以必须先在ad中新建账号后才能在CRM中新建.而online是和Office365(下文简称O365)绑定的,所以需在O36 ...
- [Flutter] Style a message chat style-ish bubble
const kOtherBubblePointer = BorderRadius.only( topRight: Radius.circular(30), bottomLeft: Radius.cir ...