来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial

这里介绍的是使用theano的一些基础知识,虽然theano是用来dl 的,不过其中的一些函数还是挺有用的,可以用在ml 里面。

在python或者ipython的交互模式下,可以按照如下形式来import theano:

>>> from theano import *

这里有几个你需要使用的符号都在theano的tensor这个子包中。让我们首先导入这个子包,并给它赋值一个新的变量名比如 T :

>>> import theano.tensor as T

如果这一步没报错,那么就可以准备接下来的教程了,不然还是回头去安装好theano吧( Installing Theano),我的安装过程

在整个教程中,记得有一个术语表( Glossary ,就在该博文下面这个目录的下面)可以用来作为索引和模块链接的。

下面是 theano basic tutorial的目录(其中1、2、23节内容都在本页,其他的另成一页):

  • 1、Python简单教程,下面是4个网页链接,其中有经典的练习和书籍
  • 2、NumPy复习
  •     2.1机器学习的矩阵约定
  • 行表示水平方向,列表示竖直方向。每一行就是一个样本。所以inputs[10,5] 就是一个有着10个样本的矩阵,其中每个样本的维度为5。如果这是一个NN的输入,那么从输入到第一层隐藏层的权重就表示为size (5, #hid)的矩阵。

    考虑这样一个数组:

    >>> numpy.asarray([[1., 2], [3, 4], [5, 6]])
    array([[ 1., 2.],
    [ 3., 4.],
    [ 5., 6.]])
    >>> numpy.asarray([[1., 2], [3, 4], [5, 6]]).shape
    (3, 2)

    这是一个3*2的矩阵,即有3行2列。

    访问第3行(row#2)第1列(column #0)的元素:

    >>> numpy.asarray([[1., 2], [3, 4], [5, 6]])[2, 0]
    5.0

    这里需要注意的是,我们是从左到右,从上到下读取的,所以一行是连续的,也就是3行2列。

    2.2广播(Broadcasting)

    Numpy 会在算术操作的时候对不同形状的数组进行广播。也就是说更小的那个数组(或者标量)会广播成对应的那个更大的数组,从而能够进行数学计算。下面就是一个广播的例子:

    >>> a = numpy.asarray([1.0, 2.0, 3.0])
    >>> b = 2.0
    >>> a * b
    array([2., 4., 6.])

    更小的数组b (实际上这里只是个标量, 可以看成是一个0d数组) 在这种情况下,在乘法运算中就会广播成相同的size。该技巧通常用在简化所写的表达式上。 更多有关广播的详细细节请查看numpy user guide.

  • 3、Baby Steps - Algebra翻译
  • 4、More Examples翻译
  • 5、Graph Structures翻译
  • 6、Printing/Drawing Theano graphs翻译
  • 7、Derivatives in Theano翻译
  • 8、Configuration Settings and Compiling Modes翻译
  • 9、Loading and Saving翻译
  • 10、Conditions翻译
  • 11、Loop翻译
  • 12、Sparse翻译
  • 13、Using the GPU翻译
  • 14、PyCUDA/CUDAMat/Gnumpy compatibility翻译
  • 15、Understanding Memory Aliasing for Speed and Correctness翻译
  • 16、How Shape Information is Handled by Theano翻译
  • 17、Debugging Theano: FAQ and Troubleshooting翻译
  • 18、Profiling Theano function翻译
  • 19、Extending Theano翻译
  • 20、Extending Theano with a C Op
  • 21、Python Memory Management
  • 22、Multi cores support in Theano翻译
  • 23、Frequently Asked Questions
  • 23.1如何更新权重的子集?

    如果你只想要更新一个权重矩阵的子集(例如某些行,某些列),这种情况在每次迭代的前向传播过程中会遇到。那么cost函数应该被定义成只依赖在这次迭代中当前权重子集的方式才行。

    例如,如果你想要学习一个查找表,例如,在处理词向量(word embedding)的时候,每一行的权重向量用来表示模型从一个单词学到的embedding,在每次迭代中,那些唯一需要更新的行都是在前馈传播中包含着embedding的。这里介绍下theano 函数应该如何来写:

    对查找表定义一个共享变量

    >>> lookup_table = theano.shared(matrix_ndarray).

    通过传递所需要行或者列的整数索引向量来得到这个表的一个子集 (某些行或者某些列) .

    >>> subset = lookup_table[vector_of_indices]

    从现在开始,使用 ‘subset’,而不会再调用 lookup_table[vector_of_indices] 了。这会造成梯度上的问题,因为这会生成新的变量

    定义cost只依赖于subset而不是整个lookup_table:

    >>> cost = something that depends on subset
    >>> g = theano.grad(cost, subset)

    有两种方式来更新这些参数:使用inc_subtensor 或者set_subtensor。推荐使用 inc_subtensor。一些theano是在这两者之间通过转换来进行优化的,不过不是所有情况下都是如此:

    >>> updates = inc_subtensor(subset, g*lr)
    OR
    >>> updates = set_subtensor(subset, subset + g*lr)

    如果你不使用inc_subtensor或set_subtensor与其他类型的索引,那么我们只需要掌握这里的情况就可以了。

    定义这个theano函数

    >>> f=theano.function(..., updates=updates)

    注意到你可以计算cost函数关于整个lookup_table的梯度, 在前馈传播过程中选取的行中会有非0行的梯度。 如果你使用梯度下降来进行更新这些参数,那么就不会有问题,除了不必要的计算,例如,你可能会使用许多梯度为0的行来更新这个查找表的参数。然而,如果你想要使用一个不同的优化方法比如rmsprop 或者 Hessian-Free 优化,那么就会有问题。在 rmsprop 中,你需要通过平方根除以当前的梯度(whose square root you divide the current gradient,不知道翻译的对不对)来逐部分的逐步重新调整,从而保持一个指数衰减平方梯度(exponentially decaying squared gradient)。如果对应一个罕见单词的查找表行的梯度经常出现0,那么对于这一行来说该梯度的平方将倾向于0,因为该行的衰减倾向于为0;使用Hessian-Free的话,你会得到许多的0行和0列,甚至它们中有些还是不可逆的。通常来说,只计算梯度关于在前馈传播中实际用到的查找表的行会更好。

Glossary(术语表)

Apply
apply的实例表示从一些输入变量(Variable )到生成一些输出变量( Variable )的操作( Op ) 。就像是数学形式上的函数在输入的参数上的应用.
Broadcasting

广播这个机制允许有着不同数量维度的张量能够应用在逐元素处理的情形下。它通过在缺失的维度的方向上将更小的张量进行复制来实现的。

更详细的,可以看看Broadcasting in Theano vs. Numpy, 和 * SciPy documentation about numpy’s broadcasting * OnLamp article about numpy’s broadcasting

Constant

一个有着不可变值的变量。例如,当你输入如下:

>>> x = tensor.ivector()
>>> y = x + 3

那么在graph中就会创建一个常量3。

See also: gof.Constant

Elementwise

两个张量变量 M 和 N的一个逐元素操作 f 的形式如下:

f(M, N)[i, j] == f(M[i, j], N[i, j])

换句话说,输入矩阵中的每个元素是和其他矩阵对应位置上的元素相结合的。 当元素的坐标[i, j] 没有对应的时候,元素之间是没有依赖关系的,所以逐元素操作就像是在几个维度上的一个标量操作。 在不同维度张量上的逐元素操作可以通过 broadcasting (广播)更小的维度来实现。

Expression
见 Apply
Expression Graph

Variable 和 用来表示变量之间的符号函数关系的Apply 节点相连可以构成一个有向,无环集合。你可以通过定义表达式图来使用theano,然后用 theano.function来对他们进行编译。

See also VariableOpApply, 和 Type, 或者更多的可以看看 Graph Structures.

Destructive

当计算一个或多个输入需要被重写要不然就会失效,那么该操作 Op (对于某个具体的input[s])就是破坏性的。例如,inplace 操作就是破坏性的。不过破坏性的操作有时候比非破坏性的操作快很多。theano建议用户不要将破坏性的操作放入graph中,然后给  theano.function but 不过却可以可以通过对优化插入破坏性的操作来优化。

破坏性的操作可以通过 destroy_map 的操作属性来指明。 (See gof.Op.

Graph
见 expression graph
Inplace
Inplace计算是会带有破坏它们输入的副作用的。例如,如果你需要对一个矩阵进行迭代,其中的操作是将每个元素乘以2,那么这就是一个inplace操作,因为当你完成的时候,原始的输入已经被重写了。这说明inplace 计算是破坏性的 destructive, 默认情况下它们只能被用来作为优化的插入,而不是用户编写的代码。
Linker
 Mode 函数的一部分,一个用来负责“运行”编译后函数的对象。在其他环境下,linker 决定着计算是用C 还是 Python 的代码。
Mode
一个提供了 optimizer 和 linker 的对象,会被传送给 theano.function. 它可以将一个表达式图如何转换成一个可调用的对象进行参数化
Op

一个 Apply 的 .op和它的符号输入一起决定着在运行的时候,哪种计算方式会被使用。在theano中,例如加法 (T.add) 和索引 x[i] 这样的数学上的函数都是操作。库文档中大部分都是用来描述不同的操作的,不过你可以自行添加其他的操作。

See also VariableType, 和 Apply, 更详细的可以看 Graph Structures.

Optimizer
 Optimizer,的一个实例,可以提供 optimization (或者 optimizations)。
Optimization
 optimizer 应用的 graph 变换发生在theano.function 对 graph的编译的时候。
Pure
当没有发生破坏性的副作用的时候操作 Op 是纯粹的。
Storage
T用来存储变量值的内存部分。在大多数情况下,存储是与编译后的函数内部相关的,不过在某些情况下 (例如 constant 和 shared variable 的时候,存储就不是内部相关了。
Shared Variable
一个可以在不同的函数之间共享的变量( Variable ) 。可以参考共享和theano.function.
theano.function
将符号表达式图编译成可调用的对象的theano的接口。可以参考 function.function().
Type

Variable  .type 用来表示哪一种值会在编译后的graph中被计算。继承自Type的实例,用来作为一个变量 Variable.的.type属性。

See also VariableOp, 和 Apply, 更多可以看看Graph Structures.

Variable

这是你使用theano的时候主要用到的数据结构。例如:

>>> x = theano.tensor.ivector()
>>> y = -x**2

x 和 y 都是 Variables, 即,是Variable 这个类的实例。

See also TypeOp, and Apply, 或者更详细的可以看看 Graph Structures.

View

一些张量操作 (例如 Subtensor 和 Transpose) 可以通过简单的对输入重新索引来保持在常量时间内完成。从apply的实例得到输出的这样的操作被称为 Views 是因为它们的存储可能会被其他变量(apply的输入)的存储别名了. 对于theano来说,知道哪些变量是其他变量的views是很重要的,因为这样就可以引入正确的 Destructive 操作.

View 操作是通过一个 view_map 操作属性来表示的。 (See gof.Op.

Theano2.1.1-基础知识之准备工作的更多相关文章

  1. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  2. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  3. [转帖]linux基础知识大纲

    linux基础知识大纲 https://blog.csdn.net/CSDN___LYY/article/details/80810403 1.Linux操作系统概述Linux操作系统的发展过程.创始 ...

  4. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  5. kubebuilder实战之三:基础知识速览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  7. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  8. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  9. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

随机推荐

  1. 实战Ubuntu Server上配置LXDE+VNC环境

    1.安装x-window 使用apt-get 安装 xorg sudo apt-get install xorg 如果提示以下内容,就说明需要update下源列表,使用sudo apt-get upd ...

  2. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  3. C# 和 C++ 数据类型对照表

    又要用C#调用C++写好的api函数,为了方便,将网上的数据类型做个整理,方便以后查找,以后遇到需要的在进行查找 C++ C#             WORD ushort     DWORD ui ...

  4. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  5. [转]jqGrid 属性、事件全集

    本文转自:http://blog.csdn.net/rosanu_blog/article/details/8334070 以下是jqGrid 最常用的属性和事件,经过一段时间的整理,终于弄的差不多了 ...

  6. Java与模式读书笔记

    >设计目标:可扩展性,灵活性,可插入性. >设计原则 ● Open Closed Principle 开闭原则 对扩展开放,对修改关闭. 对面向对象的语言来说,不可以更改的是系统的抽象层, ...

  7. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    A 思路: 贪心,每次要么选两个最大的,要么选三个,因为一个数(除了1)都可以拆成2和3相加,直到所有的数都相同就停止,这时就可以得到答案了; C: 二分+bfs,二分答案,然后bfs找出距离小于等于 ...

  8. 紫书例题-Ancient Cipher

    Ancient Roman empire had a strong government system with various departments, including a secret ser ...

  9. 在C++中实现字符串分割--split

    字符串分割 在一些比较流行的语言中,字符串分割是一个比较重要的方法,不论是在python,java这样的系统级语言还是js这样的前端脚本都会在用到字符串的分割,然而在c++中却没有这样的方法用来调用. ...

  10. webpack中output配置项中chunkFilename属性的用法

    chunkFilename和webpack.optimize.CommonsChunkPlugin插件的作用差不多,都是用来将公共模块提取出来,但是用法不一样,这里主要介绍chunkFilename的 ...