利用ReLU输出稀疏性加速卷积

一篇讲利用ReLU输出的稀疏性来加速卷积计算的论文,其目的和另一篇文章《More is less》 有点类似。

实验效果似乎还不错,但似乎并没有很大的创新。

文章链接: 《Speeding up Convolutional Neural Networks By Exploiting the Sparsity of Rectifier Units》

Motivation

下图的结论是:使用ReLU作为激活函数的网络,其网络输出通常都非常稀疏。

另一方面,目前的稀疏矩阵运算效率并不高。

Method

只要弄明白卷积的机制,就很容易明白本文干了什么。

通常使用ReLU作为激活函数会导致输出很稀疏,从而也使得后续的卷积输入变得稀疏。 如下图所示,假如输入feature map维度为 \(4\times 4\times 2\),非常稀疏只有一个非零值0.4; 再假如有4个 \(2\times 2\times 2\)的卷积核,且卷积步长为2。 则中间的图示,即是传统的im2col+GEMM的卷积计算方式。

可以看出,这种计算存在非常大的冗余。 本文的方法,不计算完整的矩阵乘法,而是只计算非0值导致的输出。并且,充分利用AVX或者SSE指令完成 \((1\times1) \times (1\times4) \)的乘法。

Experiments

作者只对稀疏度大于0.6的层进行处理,估计是稀疏度太小时这种操作肯定没有专业的Blas库快。

总结:

(1) 不需要额外的训练,只需要修改卷积的实现,基本上是工程优化的任务;

(2) 整体的加速效果,跟输入的稀疏性有着直接关系,但是就我观察,很多网络的ReLU输出虽然比较稀疏,但稀疏度大于0.6的并不多;

(3) 可以考虑对网络每层的输出加入类似1范数Loss的约束,人为地使输出更加稀疏,不过具体会不会造成网络性能的明显下降就需要更多的实验了。

时间: 2024-10-03 01:32:36

利用ReLU输出稀疏性加速卷积的相关文章

利用中转输出表制作HijackDll

[原创]利用中转输出表制作HijackDll(附工具源码)作 者: baixinye时 间: 2012-08-05,16:48:45链 接: http://bbs.pediy.com/showthread.php?t=154269 众所周知,PE文件中的导出表指向一个IMAGE_EXPORT_DIRECTORY结构,该结构定义如下: typedef struct _IMAGE_EXPORT_DIRECTORY {    DWORD   Characteristics;    DWORD   Ti

浅谈压缩感知(九):范数与稀疏性

问题: 压缩感知问题求稀疏解时,一般采用0范数或者1范数来建立数学模型.那么为什么0范数或1范数可以得到稀疏解呢? 解释与分析: 1.范数 常见的有L0范数.L1范数.L2范数,经常要将L0范数等价为L1范数去求解,因为L1范数求解是一个凸优化问题,而L0范数求解是一个NP难问题. L0范数指的是x中非零元素的个数,即x的稀疏度,如果x是K稀疏的,则l0范数等于K: L1范数指的是x中所有元素模值的和: L2范数指的是x中所有元素模值平方的和 再平方,这个带公式就可以了,它代表着距离的概念: 还

L1、L2范式及稀疏性约束

L1.L2范式及稀疏性约束 假设需要求解的目标函数为: E(x) = f(x) + r(x) 其中f(x)为损失函数,用来评价模型训练损失,必须是任意的可微凸函数,r(x)为规范化约束因子,用来对模型进行限制,根据模型参数的概率分布不同,r(x)一般有:L1范式约束(模型服从高斯分布),L2范式约束(模型服从拉普拉斯分布):其它的约束一般为两者组合形式. L1范式约束一般为: L2范式约束一般为: L1范式可以产生比较稀疏的解,具备一定的特征选择的能力,在对高维特征空间进行求解的时候比较有用:L

利用objc_getClassList输出项目所有类

利用objc_getClassList输出项目所有类 by 伍雪颖 int numClasses; Class *classes = NULL; classes = NULL; numClasses = objc_getClassList(NULL, 0); NSLog(@"Number of classes: %d", numClasses); if (numClasses > 0 ) { classes = (__unsafe_unretained Class *)mallo

稀疏自动编码之自动编码器和稀疏性

到目前为止,已经叙述了神经网络的监督学习,即学习的样本都是有标签的.现在假设我们有一个没有标签的训练集,其中. 自动编码器就是一个运用了反向传播进行无监督学习的神经网络,学习的目的就是为了让输出值和输入值相等,即.下面就是一个自动编码器: 自动编码器试图学习一个函数. 换句话说,它试图逼近一个等式函数,使得该函数的输出  和输入  很近似.举一个具体的例子,假设输入  是来自一个  图像(共100个像素点)像素点的灰度值,在  层有  个隐层节点. 注意输出 . 由于隐层节点只有50个,所以网络

利用js输出ul下li的index索引值

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>打印索引</title> </head> <style type="text/css"> li{background: pink;margin-bottom: 10px;height: 40px;} </style> <body>

使用cuda加速卷积神经网络-手写数字识别准确率99.7%

源码和运行结果 cuda:https://github.com/zhxfl/cuCNN-I C语言版本参考自:http://eric-yuan.me/ 针对著名手写数字识别的库mnist,准确率是99.7%,在几分钟内,CNN的训练就可以达到99.60%左右的准确率. 参数配置 网络的配置使用Config.txt进行配置##之间是注释,代码会自动过滤掉,其他格式参考如下: #Comment# #NON_LINEARITY CAN = NL_SIGMOID , NL_TANH , NL_RELU#

python利用递归函数输出嵌套列表的每个元素

1.先用 for 循环取. for item in l: if isinstance(item ,list): for newitem in item: print(newitem) else: print(item 输出: 1 2 3 4 5 6 #利用 for 循环取值,有几层嵌套就要写几层 for 循环,否则不识别. l=[1,2,[3,4],[5,6,[7,8]]] for item in l: if isinstance(item ,list): for newitem in item

Node.js系列文章:利用console输出日志文件

通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单介绍一下. 我们首先创建如下文件: // index.js let fs = require('fs'); let options = { flags: 'a', // append模式 encoding: 'utf8', // utf8编码 }; let stdout = fs.createWri