让我们开始一个交互式会话(例如使用pythonipython)并导入Theano。

from theano import *

你需要使用Theano的tensor子包中的几个符号。让我们以一个方便的名字,例如T导入这个子包(教程将经常使用这个约定)。

import theano.tensor as T

Numpy

机器学习的矩阵惯例

行是水平的,列是垂直的。每一行都是一个样本。因此,inputs[10,5]是10个样本的矩阵,其中每个样本具有维度5。如果这是神经网络的输入,则从输入到第一个隐藏层的权重将表示大小(5, #hid)的矩阵。

import numpy as np
a=np.asarray([[1,2],[3,4],[5,6]])
print a
print a.shape [[1 2]
[3 4]
[5 6]] (3, 2)

这是3×2矩阵,即有3行和2列。

要访问第3行(#2行)和第1列(#0列)中的元素:

print a[2,0]

记住这一点,我们从左到右、从上到下读取,所以连续的元素是一行。也就是说,有3行和2列。

Broadcasting

Numpy在算术运算期间对不同形状的数组进行broadcasting。这通常意味着较小的数组(或标量)被broadcasted到较大的数组,以让它们具有兼容的形状。下面的示例演示broadcastaing的一个实例:

a=np.asarray([1,2,3])
b=3
print a*b [3 6 9]

在这种情况下,这里较小的数组b(实际上是标量,其工作原理类似于一个0维数组)在乘法过程中被broadcasted到与a相同的大小。这个技巧通常用于简化表达式的写法。

代数

两个标量相加

为了让我们开始使用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=function([x,y],z)
print f(2,3) 5.0

让我们分成几个步骤。第一步是定义两个符号(变量),表示要相加的数量。注意,从现在起,我们将使用术语变量来表示“符号”(换句话说,xyz都是变量对象)。函数f的输出是零维度的numpy.ndarray

如果你正在跟着输入解释器,你可能已经注意到执行function指令有一点点延迟。在幕后,f正在被编译成C代码。

步骤1

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

在Theano中,所有的符号必须具有类型。特别地,T.dscalar是我们分配给“0维数组(双精度浮点数(d)的标量)”的类型。它是Theano的Type类型。

dscalar不是类。因此,xy都不是dscalar的实例。它们是TensorVariable的实例。然而,xytype字段赋值为theano的dscalar类型,正如你在下面看到的:

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

通过使用字符串参数调用T.dscalar,你将创建一个给定名称的变量,表示一个浮点数标量。如果你不提供参数,符号将不会命名。名称不是必需的,但它们可以帮助调试。

步骤2

第二步是将xy组合到它们的和z中:

z=x*y

z是另一个变量,表示xy相加。你可以使用pp函数精确打印与z相关的计算。

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

步骤3

最后一步是创建一个以xy作为输入并将z作为输出的函数:

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

function的第一个参数是一个变量列表,它们将作为函数的输入。第二个参数是单个变量一个变量的列表。不管哪一种情况,第二个参数是当我们应用函数时我们想要看到它的输出。f可以像普通的Python函数一样使用。

注意

作为一个捷径,你可以跳过第3步,只需使用变量的eval方法。eval()方法不像function()一样灵活,但它可以完成我们在本教程中介绍的所有内容。它有额外的好处,不需要你导入function()。下面是eval()的工作原理:

x=T.dscalar('x')
y=T.dscalar('y')
z=x+y
print z.eval({x:1,y:2}) 3.0

我们传递给eval()一个字典,将theano的符号变量映射到值来替换它们,然后它返回表达式的数值。

eval()在第一次调用变量时会变慢 - 需要调用function()来编译后台表达式。在同一变量上对eval()的后续调用将很快,因为变量缓存编译的函数。

两个矩阵相加

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

dmatrix是双精度(double)矩阵的类型。然后我们可以在二维数组上使用我们的新函数:

f=function([x,y],z)
print f([[1,1],[1,1]],[[1,2],[3,4]]) [[ 2. 3.]
[ 4. 5.]]

变量是NumPy数组。我们也可以直接使用NumPy数组作为输入:

print f(np.asarray([[1,1],[1,1]]),np.asarray([[1,2],[3,4]]))
[[ 2.  3.]
[ 4. 5.]]

可以标量与矩阵相加,向量与矩阵相加,标量与向量相加等。这些操作的行为由broadcasting定义。

以下类型可以使用:

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

Theano教程的更多相关文章

  1. Theano教程:Python的内存管理

    在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...

  2. 库、教程、论文实现,这是一份超全的PyTorch资源列表(Github 2.2K星)

    项目地址:https://github.com/bharathgs/Awesome-pytorch-list 列表结构: NLP 与语音处理 计算机视觉 概率/生成库 其他库 教程与示例 论文实现 P ...

  3. video2gift环境安装(Theano等)

    pip install Theano http://deeplearning.net/software/theano/install_centos6.html pip install moviepy ...

  4. theano 模块 MLP示例

    theano 模块 MLP示例,有需要的朋友可以参考下. theano教程Example: MLP: 约定数组为列向量, 层级:将多层传感器定义为一连串的层级,每个层级定义为一个类.类属性包括:权重. ...

  5. DeepLearning之路(三)MLP

    DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/articl ...

  6. TensorFlow资源整理

    什么是TensorFlow? TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...

  7. tensorflow实现基于LSTM的文本分类方法

    tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...

  8. 一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)

    雷锋网按:本文作者陆池,原文载于作者个人博客,雷锋网已获授权. 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用 ...

  9. [转]CNN目标检测(一):Faster RCNN详解

    https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgi ...

随机推荐

  1. Unity C#数据持久化与xml

    最近工作需要用到数据持久化,所以在此分享一下,通过查阅资料,数据持久化大体都是通过xml或者json来进行的.unity为我们自定义了数据持久化方法,但是比较局限,还需要自己来完成数据持久化方法. ( ...

  2. C语言I博客作业07

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-1/homework/9931 我在这个课程的目标 ...

  3. [ZJOI2006]碗的叠放

    Description 小H有n个碗需要放进橱柜,她希望将他们叠起来放置.你知道每个碗都是规则的圆柱体,并且都是上宽下窄,你已经测量出了每个碗的两个半径及高,请你帮小H找出一种叠放顺序,使得叠放出来的 ...

  4. [python]一些常用的python知识总结

    Pthon知识积累,遇到的各种python问题汇总 json.dumps()和json.loads()是json格式处理函数 json.dumps()函数是将一个Python数据类型列表进行json格 ...

  5. 差异---虐爆了yxs的 后缀数组裸题 板子题 单调栈的简单应用 字符串的基础理解考察题

    先玩柿子,发现可以拆开,前半部分可以瞬间求出,于是只求后半部分 然后抄板子就好了,完结撒花! 下边是个人口胡,因为已经被虐爆头脑不清醒了 定义:LCP(a,b)为排名为a,b两个后缀的最长公共前缀 证 ...

  6. SSHD服务安全的连接

    SSHD服务 SSH 安全的远程连接 OpenSSH 工具 centos服务端的包:openssh-server centos客户端的包:openssh-clients 主要配置文件一般安装完成后再/ ...

  7. 爬虫学习--Day4(小猿圈爬虫开发_2)

    requests模块 - urllib模块 - requests模块 requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高.作用:模拟浏览器发送请求. 如 ...

  8. thinkphp5.1长连接-单例模式测试!

    在控制器中  使用以下代码测试 for ($i = 0; $i < 1000; $i++) { $tmp['name'] = 'f_'.$i; $tmp['times'] = date('Y-m ...

  9. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)

    说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect  容器id  ...

  10. docker搭建本地registry

    第一步:拉取registry镜像 [root@localhost iso]# docker image pull registry Using default tag: latest latest: ...