Theano2.1.11-基础知识之稀疏
来自:http://deeplearning.net/software/theano/tutorial/sparse.html
sparse
通常来说,稀疏矩阵可以和常规矩阵一样提供相同的功能。两者不同之处在于在内存中存储矩阵和表示矩阵的方式。 在稀疏矩阵中,只有非0元素才会被存储。这种方式带来的优点有:首先,这可以很明显的减少内存的使用‘第二;通过使用指定的稀疏算法和这种稀疏存储方法可以减少计算时间。我们通常将常规的存储矩阵叫做密集矩阵(dense matrices)。
Theano的稀疏包提供高效的算法,不过却并不推荐在所有的矩阵和所有的情况下使用。正如一个显而易见的例子,当稀疏比例非常低的时候,就等于在常规矩阵上使用这些算法,而且本身带来的存储开销会比常规矩阵还大。稀疏比例指的是元素为0的值所占整个矩阵上所有元素的个数比。一个低稀疏比例会导致在内存上使用更多的空间,不只是需要存储实际的数据,而且还需要存储每个元素的位置信息。这同样需要更多的计算时间,然而一个密集矩阵是使用常规优化算法的,可能效果比这时候的稀疏表示矩阵更高效。其他例子可以在特定目的和矩阵的结构的联系上找到。更多的文档可以查看 SciPy
Sparse Reference.
因为稀疏矩阵不是存储在连续数组上的,所以有几种方式来存储。这通常被设计成所谓的矩阵的格式(format)。因为 Theano的稀疏矩阵包是基于SciPy 稀疏包的,完整的有关稀疏矩阵的信息可查阅 SciPy的文档。就像SciPy一样, Theano没有对那些维度不等于2的数组实现稀疏格式。
到目前为止,Theano实现了两个稀疏矩阵的格式: csc and csr。 这些几乎是等同的,除了csc是基于矩阵的列,而csr是基于矩阵的行的。他们都是有着相同的目的:为了提供给高效的算法用来执行线性代数操作。不过缺点就是它们没法通过一个高效的方法来修改潜在矩阵的稀疏结构,例如:增加元素。这也就是说如果你在你的计算graph中会频繁的在稀疏矩阵中增加新的元素,也许一个tensor变量是更好的选择。
更多的文档可以查看 Sparse Library Reference.
在进行下一步之前,来做做准备工作:
>>> import theano
>>> import numpy as np
>>> import scipy.sparse as sp
>>> from theano import sparse
一、稀疏压缩格式
Theano支持两种稀疏压缩格式: csc 和 csr,
分别是基于列和行的。他们都有着相同的属性: data, indices, indptr 和 shape.
- data 属性是一个一维的 ndarray ,它包含稀疏矩阵所有的非0元素。
- indices 和indptr 属性是用来存储稀疏矩阵中数据的位置的。
- shape 属性,准确的说是和密集矩阵的shape属性一样的。如果从前三个属性上没法推断,那么它可以在稀疏矩阵创建的时候显式指定 。
1.1 应该使用哪种格式 ?
最后,格式不会影响到data和indices属性的长度(length)。它们都是通过你所想存储的元素个数确定的。唯一会被格式改变的就是 indptr。在csc 格式下,该句子是按着列进行压缩的,所以列数量更少的时候,所需要的内存就更少。另一方面,csr 格式下,句子是按行压缩的,所以当一个矩阵有着更少行数的时候,csr格式是个更好的选择。下面就是规则的形式:
note:If
shape[0] > shape[1], 使用 csr format.
;否则,使用 csc。(觉得这里和上面说的完全相反了,上面说当矩阵行少的时候用csr)。
有时候,因为稀疏模块到现在的时间还不长,ops还没有针对两种format的操作。所以这里也是最相关的规则:
note:使用该矩阵格式可以兼容你计算graph中的ops。
关于ops和所支持的format等文档可以查阅: Sparse
Library Reference.
二、在theano中处理稀疏
在theano中大多数的ops都是依赖于稀疏矩阵的格式(format)的。这就是为什么有两种稀疏变量的构造器: csc_matrix 和 csr_matrix。这些都能被普通的name和dtype参数所调用,不过没有 broadcastable 标识。这是被禁止的,因为稀疏包(和SciPy的稀疏模块一样)不提供任何方式来处理维度不等于2的情况的矩阵。稀疏矩阵的所有可接受的dtype值可以在 sparse.all_dtypes中找到:
>>> sparse.all_dtypes
set(['int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64',
'float32', 'float64', 'complex64', 'complex128'])
2.1 转换
为了在稀疏矩阵和密集矩阵之间相互转换。Theano提供了 dense_from_sparse,csr_from_dense 和 csc_from_dense 函数。不需要任何额外的细节。这里就是从稀疏到稀疏的一个完整转换的例子:
>>> x = sparse.csc_matrix(name='x', dtype='float32')
>>> y = sparse.dense_from_sparse(x)
>>> z = sparse.csc_from_dense(y)
2.2 属性和构造
尽管稀疏变量不允许直接访问它们的属性,不过还是可以通过 csm_properties 来完成的。它会返回一个一维的tensor变量的元组,用来表示稀疏矩阵的内部特征。
为了从某些属性上重构一个稀疏矩阵,可以使用函数 CSC 和 CSR 。这会以合适的格式来创建稀疏矩阵。例如,下面的代码重构一个csc矩阵到csr格式:
>>> x = sparse.csc_matrix(name='x', dtype='int64')
>>> data, indices, indptr, shape = sparse.csm_properties(x)
>>> y = sparse.CSR(data, indices, indptr, shape)
>>> f = theano.function([x], y)
>>> a = sp.csc_matrix(np.asarray([[0, 1, 1], [0, 0, 0], [1, 0, 0]]))
>>> print a.toarray()
[[0 1 1]
[0 0 0]
[1 0 0]]
>>> print f(a).toarray()
[[0 0 1]
[1 0 0]
[1 0 0]]
最后的例子显示,格式可以从一个转换到另一个。的确,当调用transpose函数的时候,生成的矩阵的稀疏特征就不会和输入的时候一样了
2.3 结构(structured)操作
有几个ops是用在稀疏矩阵的非常奇特的结构上的。这些ops是结构式的(structured),而且不会在稀疏矩阵的0元素上有任何的计算操作。 它们被认为是只用在后面(暂时不知道是指哪个)的数据属性上的。 注意,这些结构操作都提供一个结构梯度(structured
gradient)。更多的解释如下:
>>> x = sparse.csc_matrix(name='x', dtype='float32')
>>> y = sparse.structured_add(x, 2)
>>> f = theano.function([x], y)
>>> a = sp.csc_matrix(np.asarray([[0, 0, -1], [0, -2, 1], [3, 0, 0]], dtype='float32'))
>>> print a.toarray()
[[ 0. 0. -1.]
[ 0. -2. 1.]
[ 3. 0. 0.]]
>>> print f(a).toarray()
[[ 0. 0. 1.]
[ 0. 0. 3.]
[ 5. 0. 0.]]
2.4 梯度
在稀疏模块中ops的梯度同样可以是structured。一些ops提供一个 flag 来指定该梯度是否structured。该文档可以用来决定一个op的梯度是否是常规的还是structured还是它的实现是否能够被修改。相似于structured
ops,当计算了一个structured gradient的时候,该计算只会应用在系数矩阵的非0元素上。
更多有关特定op上的梯度可以查阅: Sparse Library Reference.
参考资料:
[1]官网:http://deeplearning.net/software/theano/tutorial/sparse.html
Theano2.1.11-基础知识之稀疏的更多相关文章
- 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载
同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...
- 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))
关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- java基础知识 多线程
package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...
- Python开发【第二篇】:Python基础知识
Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
随机推荐
- OSGI入门笔记
OSGI框架为Java定义了一个动态模块化系统,它使你可以更好地控制代码结构,动态管理代码的生命周期,并且提供了代码写作的松耦合方式:更值得称道的是,它的规范文档描述详尽.--<OSGI实战&g ...
- AS与.net的交互——加载web上的xml
最近搞了个私活,需要用as去加载一个网站的xml,不过本人as也不咋滴,就去看看怎么玩,看完之后也蛮简单的. 由于业务上比较复杂,就随便说个小例子吧. 很多时候,为了页面区域更加灵活,生动,有吸引力, ...
- 检测PC端和移动端的方法之一
window.mobileCheck = function() { var check = false; (function(a){if(/(android|bb\d+|meego).+mobile| ...
- 编写一个Java应用程序,该应用程序包括2个类:Print类和主类E。Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身,如: 371 = 33 + 73 + 13。)在主类E的main方法中来 测试类Print
package zuoye; public class print { void output() { System.out.println("100-999之间的水仙花数是:") ...
- 利用apply和arguments复用方法
首先,有个单例对象,它上面挂了很多静态工具方法.其中有一个是each,用来遍历数组或对象. var nativeForEach = [].forEach var nativeMap = [].map ...
- java汉化
http://download.eclipse.org/technology/babel/babel_language_packs/R0.13.0/luna/luna.php _x86_64版本下载地 ...
- C语言中链表怎么删除结点?
第一个方法: /*根据姓名删除链表的中的学生记录*/ void deleteByName(struct STUDENT * head) { struct STUDENT *p,*q; ]; if(he ...
- 学习OpenStack之 (3):Devstack Screen 使用技巧
Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中.我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看 ...
- Addthis使用
一.使用 https://www.addthis.com/.国外的SNS分享站点较多,适用于英文站点内容的分享.有教程. 我的测试代码如下: <html> <meta charset ...
- [转]NopCommerce How to code my own payment method
本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+payment+method Payment methods are im ...