来自: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. python 读写文件

    #! -*- encoding:utf-8 -*- import os from config import * from function import GetCsspToken, RegistIn ...

  2. coursera机器学习笔记-神经网络,初识篇

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  3. dpkg

    dpkg是debian最早提出的一个软件包管理工具,因为早期并没有考虑到当下软件包之间这么复杂的依赖关系,所以并不能自动解决软件包的依赖问题,这个命令多用于安装本地的.deb软件包,也可以进行软件包的 ...

  4. Jmeter默认报告优化

    一.本文目的: 之前写了两篇文章搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)和ANT批量执行Jmeter脚本,功能实现上都没有什么问题,但是最后生成的报告有一点小问题,虽然不影响使 ...

  5. x01.os.12: 在 windows 中写 OS

    在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...

  6. linux基础-第七单元 用户、群组及权限的深入讨论

    怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...

  7. linux监控命令nc用法

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  8. docker-image container 基本操作 -常用命令

    基本概念: container 容器.可以把每个 container 看做是一个独立的主机. container 的创建通常有一个 image 作为其模板.类比成虚拟机的话可以理解为 image 就是 ...

  9. u3d_Shader_effects笔记4 BRDF

    1.英文意思 bidirectional reflectance distribution function bidirectional :双向的 reflectance :反射 distributi ...

  10. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...