来自: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,
分别是基于列和行的。他们都有着相同的属性: dataindicesindptr 和 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-基础知识之稀疏的更多相关文章

  1. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  2. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  3. 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载

    同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...

  4. 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...

  5. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  6. java基础知识 多线程

    package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...

  7. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  8. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  9. 学习 shell脚本之前的基础知识

    转载自:http://www.92csz.com/study/linux/12.htm  学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...

随机推荐

  1. .Net开源网络爬虫Abot介绍

    .Net中也有很多很多开源的爬虫工具,abot就是其中之一.Abot是一个开源的.net爬虫,速度快,易于使用和扩展.项目的地址是https://code.google.com/p/abot/ 对于爬 ...

  2. Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute

    上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参 ...

  3. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  4. 十五天精通WCF——第五天 你需要了解的三个小技巧

    一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说 ...

  5. 纯css实现照片墙3D效果

    每张照片都有美丽的故事.美好的回忆.家居中的照片墙则帮你展现出这些承载着家庭重要记忆的照片,除了用画框装饰照片挂在墙上外,照片墙还可以演变为手绘照片墙.也经常在网上看到一些关于照片墙的特效案例,决定自 ...

  6. LNMP环境搭建

    LNMP环境搭建 Linux + Nginx + MySQL + PHP PHP是一种脚本语言,当前中国乃至世界上使用PHP语言开发的网站非常普遍 Nginx是一个web服务软件,和apache是一类 ...

  7. Django初体验(一):自定义表单提交

    注:本人使用的Django1.8.3版本进行测试 除了使用Django内置表单,有时往往我们需要自定义表单.对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CS ...

  8. SpringMVC从入门到精通之第二章

    这一章原本我是想写一个入门程序的,但是后来仔细想了一下,先从下面的图中的组件用代码来介绍,可能更效果会更加好一点.第一节:开发准备介绍之前先说下我的开发调试环境:JDK 1.7的64位 .Eclips ...

  9. HDU1502/Luogu1352/UVa1220 party[树形DP]

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  10. KSFramework常见问题:Excel如何进行SVN协作、差异比较?

    Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注释.图标.批注等等各种辅助信息: 但是Excel是非纯文本格式,在使用SVN. ...