来自:http://deeplearning.net/software/theano/tutorial/adding.html

Baby Steps - Algebra

一、两个标量相加

在学习theano的开始,首先来感受下它是如何工作的,让我们先来定义一个简单的相加函数:

>>> import theano.tensor as T
>>> from theano import function
>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
>>> z = x + y
>>> f = function([x, y], z)

现在,我们可以使用之前创建好的函数,然后使用了:

>>> f(2, 3)
array(5.0)
>>> f(16.3, 12.1)
array(28.4)

这里是将上面部分进行分步介绍。首先定义两个符号 (变量)来表示你想要相加的数。注意到从现在开始,我们将会使用变量(Variable)来表示“符号”(换句话说,也就是 xyz 都是变量对象)。函数 f 的输出就是一个有着0维的 numpy.ndarray 。

如果你想要输入一个整数,你可能会发现在执行function的时候有轻微的延时。这是因为需要将函数 f 编译成c 代码。

第一步

>>> x = T.dscalar('x')
>>> y = T.dscalar('y')

在theano中,所有的符号都必须手动输入。具体来说,T.dscalar 就是我们分配给“doubles类型(d)的0维数组(scalar)”类型。这是一个theano类型 Type.

  dscalar 不是一个类,所以 x 和 y 都不是 dscalar的实例。他们是 TensorVariable的实例 。正如下面看到的:

>>> type(x)
<class 'theano.tensor.basic.TensorVariable'>
>>> x.type
TensorType(float64, scalar)
>>> T.dscalar
TensorType(float64, scalar)
>>> x.type is T.dscalar
True

通过一个字符串参数来调用 T.dscalar ,可以创建一个变量来表示一个给定名字下的一个浮点标量。如果你不提供参数,该符号将会是未命名的(unnamed)。虽然名字是不是必须的,可是却有助于调试。

更多的可以看看theano的内部结构。同样可以看看 Graph Structures.

第二步

第二步就是结合 x 与y 到它们的和z中

>>> z = x + y

z 是另一个变量用来表示 x 与 y的和.
你可以使用 pp 函数来友好的打印出与z
关联的计算结果。

>>> from theano import pp
>>> print pp(z)
(x + y)

第三步

最后一步就是创建一个函数,将x 与 y  作为输入,然后通过z  作为输出:

>>> f = function([x, y], z)

function 的第一个参数是变量的列表,用来作为输入提供给函数。第二个参数是一个单一的变量或者一个变量列表。在其他情况下,第二个变参数就是我们想要的输出。然后f
就可以被和普通的python函数一样使用了。
note:作为一个快捷方式,你可以跳过第三步,值使用一个变量的eval() 方法。 eval() 方法没有 function() 这么灵活,不过却能做教程中的任何事情。这是你不需要inport function() 的额外的福利.
下面就是 eval() 工作的过程:

>>> import theano.tensor as T
>>> x = T.dscalar('x')
>>> y = T.dscalar('y')
>>> z = x + y
>>> z.eval({x : 16.3, y : 12.1})
array(28.4)

我们给 eval()传递一个词典,将符号theano变量映射成值从而来取代它们,然后对表达式返回数值。

eval() 在第一次调用的时候可能会比较慢,因为它需要调用 function() 来计算场景后面的表达式。之后对 eval() 以同样的变量上的调用将会很快,因为变量已经将编译后的函数进行缓存了。

二、两个矩阵相加

你可能已经猜到如何来做了确实,这里与之前唯一的区别在于你需要实例化x 与y ,然后使用矩阵类型:

>>> x = T.dmatrix('x')
>>> y = T.dmatrix('y')
>>> z = x + y
>>> f = function([x, y], z)

  dmatrix 是doubles类型的矩阵,然后我们就能在2D数组上使用新的函数了:

 
>>> f([[1, 2], [3, 4]], [[10, 20], [30, 40]])
array([[ 11., 22.],
[ 33., 44.]])

该变量是一个 NumPy 数组。我们同样可以直接使用NumPy 数组作为输入:

>>> import numpy
>>> f(numpy.array([[1, 2], [3, 4]]), numpy.array([[10, 20], [30, 40]]))
array([[ 11., 22.],
[ 33., 44.]])

计算矩阵加标量、矩阵加向量、向量加标量都是可以的。这些能够得以实现得归功于broadcasting.

下面的类型都是可用的:

  • bytebscalar, bvector, bmatrix, brow, bcol, btensor3, btensor4
  • 16-bit integerswscalar, wvector, wmatrix, wrow, wcol, wtensor3, wtensor4
  • 32-bit integersiscalar, ivector, imatrix, irow, icol, itensor3, itensor4
  • 64-bit integerslscalar, lvector, lmatrix, lrow, lcol, ltensor3, ltensor4
  • floatfscalar, fvector, fmatrix, frow, fcol, ftensor3, ftensor4
  • doubledscalar, dvector, dmatrix, drow, dcol, dtensor3, dtensor4
  • complexcscalar, cvector, cmatrix, crow, ccol, ctensor3, ctensor4

上面的列表不够详尽,针对使用Numpy数组来兼容所有类型的更详细文档可以看: tensor creation.

note:你,用户(不是系统架构者)不得不选择你的程序为32- 或者 64-bit 的整数 (i 前缀 vs. l 前缀) 和浮点数 (f 前缀 vs. d 前缀).

三、练习

import theano
a = theano.tensor.vector() # declare variable
out = a + a ** 10 # build symbolic expression
f = theano.function([a], out) # compile function
print f([0, 1, 2]) # prints `array([0, 2, 1026])`

修改并计算这个表达式的结果: a ** 2 + b ** 2 + 2 * a * b.

下面就是答案:

#!/usr/bin/env python
# Theano tutorial
# Solution to Exercise in section 'Baby Steps - Algebra' from __future__ import print_function
import theano
a = theano.tensor.vector() # declare variable
b = theano.tensor.vector() # declare variable
out = a ** 2 + b ** 2 + 2 * a * b # build symbolic expression
f = theano.function([a, b], out) # compile function
print(f([1, 2], [4, 5])) # prints [ 25. 49.]

参考资料:

[1] 官网:http://deeplearning.net/software/theano/tutorial/adding.html

Theano2.1.2-基础知识之第一步:代数的更多相关文章

  1. C#基础知识-编写第一个程序(二)

    通过上一篇数据类型已经介绍了C#中最基本的15种预定义数据类型,了解每一种类型代表的数据以及每种类型的取值范围,这是很重要也是最基本.下面我们通过实例来了解每个类型如何去使用.编写C#程序时我们需要用 ...

  2. unix环境高级编程基础知识之第一篇

    陆陆续续看完了圣经第一章,熟悉了unix的整个编程流程,c语言的用处在这里得到伸张. 从unix的体系结构,原来操作系统包括内核及一些其他软件,我们常常误称为linux内核为操作系统,这俨然成为一种共 ...

  3. Java基础知识笔记第一章:入门

    java的地位: java具有面向对象,与平台无关,安全,稳定和多线程等优良特性,是目前软件设计中优秀的编程语言. java的特点: 1.简单 2.面向对象 3.平台无关 jre(java runti ...

  4. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

  5. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  6. (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理

    介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...

  7. 《openssl编程》:第一章基础知识

    第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...

  8. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结.所以下面给大家分享一下我的经验: 微信公众号是什么? 官网的介绍:再小的个 ...

  9. (转)第一天 XHTML CSS基础知识 文章出处:标准之路(http://www.aa25.cn/div_css/902.shtml)

    欢迎大家学习<十天学会web标准>,也就是我们常说的DIV+CSS.不过这里的DIV+CSS是一种错误的叫法,建议大家还是称之为web标准. 学习本系列教程需有一定html和css基础,也 ...

随机推荐

  1. Android 自定义Application

    在android中 自定义Application 常用的作用是1 保存在程序运行中的全局变量 实例:public class GlobalApp extends Application{ privat ...

  2. iBatis 中 Like 的写法实现模糊查询

    iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件 person.xml 中的配置为 <select id=" ...

  3. mysql字符编码集(乱码)问题解决

    1.创建数据库 CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 创建表 CREATE TABLE tp_w ...

  4. Python序列化之json与pickle

    1.json介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Progra ...

  5. ARM体系结构

    工作模式_ufisaus USR(User) :正常程序的执行状态 FIQ(Fast interrupt) :用于高速数据传输和通道处理 IRQ(Interrupt) :通常的中断处理 SVC(Sup ...

  6. kill

    向一个/一些进程发送一个信号 $kill [-slL] -s指定发送的信号,可以使用名称或者信号编号 -l列出当前系统的所有信号 $kill -l 1) SIGHUP 2) SIGINT 3) SIG ...

  7. adroid 目录

    安桌程式安装后存在目录:\手机存储\Android\data 一: //  获取当前程序路径 getApplicationContext().getFilesDir().getAbsolutePath ...

  8. js判断手机访问PC端跳转到手机站

    <script type="text/javascript">(function() { //得到域名后缀 var path = location.pathname.s ...

  9. 再不写,我怕就再也不写了-LAMP基础

    hi 经历了4天大餐的洗礼,整个人都思密达了...昨天的懒,是没有原因的懒,总之就是该提笔了亲 1.Ubuntu下的LAMP配置 -----Ubuntu基础知识----- ----管理员权限 出于安全 ...

  10. 【一周读书】All life is problem solving

    书籍:<开放的智力> 采铜是我在知乎关注最早的大V之一,那时我脑里有一大堆疑惑和问题,是他的答案帮助我理清了思绪.我从他身上学习到对书籍的爱好,对思维方法的关注,对智慧的向往.读这本小集子 ...