Theano 0.6 文档[3] - 更多例子
来源:互联网 发布:数据之巅pdf 百度云 编辑:程序博客网 时间:2024/05/17 09:12
本文为Lancelod_Liu编译, 转载请保留此行.
原文: 戳.
More Examples
更系统地熟悉Theano的基本对象和操作是非常有帮助的. 参考:Basic Tensor Functionality.
随着教程展开, 你也应该逐渐地熟悉其他相关库和相关的文档.
Logistic Function(对数函数)
下面是一个更直接的例子, 尽管比两数相加要复杂一些. 假设你想要计算对数曲线:
如果想要计算双精度浮点矩阵中每个值(elementwise)的对数值.
可以这样操作:
>>> x = T.dmatrix('x')>>> s = 1 / (1 + T.exp(-x))>>> logistic = function([x], s)>>> logistic([[0, 1], [-1, -2]])array([[ 0.5 , 0.73105858], [ 0.26894142, 0.11920292]])
对数能够按元素进行演算(elementwise)的原因是所有的操作--除, 加, 对数本身就是elementwise的操作.
下面这个例子是另一种公式表达:
可以看到结果是一致的:
>>> s2 = (1 + T.tanh(x / 2)) / 2>>> logistic2 = function([x], s2)>>> logistic2([[0, 1], [-1, -2]])array([[ 0.5 , 0.73105858], [ 0.26894142, 0.11920292]])
Computing More than one Thing at the Same Time(事半功倍)
Theano支持多输出的函数. 举例来说, 我们可以按元素同时计算两个矩阵a和b差, 差绝对值 和平方差:
>>> a, b = T.dmatrices('a', 'b')>>> diff = a - b>>> abs_diff = abs(diff)>>> diff_squared = diff**2>>> f = function([a, b], [diff, abs_diff, diff_squared])
注意
dmatrices 生成个数等于输入字符串个数的矩阵. 这是一种分配符号变量的快捷方式.
当我们使用函数时, 它返回三个变量.(the printing was reformatted for readability):
>>> f([[1, 1], [1, 1]], [[0, 1], [2, 3]])[array([[ 1., 0.], [-1., -2.]]), array([[ 1., 0.], [ 1., 2.]]), array([[ 1., 0.], [ 1., 4.]])]
Setting a Default Value for an Argument(初始状态)
如果你要定义一个方程来计算两个数的和, 当第二个数没有给定时, 你希望第二个数默认值为1. 可以如下操作:
>>> from theano import Param>>> x, y = T.dscalars('x', 'y')>>> z = x + y>>> f = function([x, Param(y, default=1)], z)>>> f(33)array(34.0)>>> f(33, 2)array(35.0)
使用Param 类来指定一些你函数参数的特性. 此处我们通过构造一个Param对象, 并将其default域设置为1来给y指定默认值1 .
带默认值的输入必须位于无默认值的输入后面(和Python的函数要求一样). 可以有多个输入都有默认值, 这些参数可以指定位置或者名字来设置, 和Python标准相同:
>>> x, y, w = T.dscalars('x', 'y', 'w')>>> z = (x + y) * w>>> f = function([x, Param(y, default=1), Param(w, default=2, name='w_by_name')], z)>>> f(33)array(68.0)>>> f(33, 2)array(70.0)>>> f(33, 0, 1)array(33.0)>>> f(33, w_by_name=1)array(34.0)>>> f(33, w_by_name=1, y=0)array(33.0)
注意
Param 并不通过局部变量y和w的名字来设置值. 符号变量对象有name的属性(attribute)(上例中使用dscalars设置的), 这些是我们创建的函数的关键字参数的名字. 这是Param(y,default=1)的工作原理. 在Param(w,default=2,name='w_by_name')中, 我们覆写了符号变量的name属性, 可以在这个函数中使用它.
更多细节: 参考这里 Function.
Using Random Numbers(随机的魅力)
因为Theano使用符号来表达每件事, 随后编译这个表达式来得到函数, 使用伪随机数并不和在NumPy中一样简单, 尽管也并不复杂.
考虑在Theano的计算中引入随机性就是在你的图中放置随机变量. Theano 会对每一个随机变量分配一个NumPyRandomStream(一个随机数生成器), 在需要的时候从中取数. 我们称这种随机数序列为一个随机流(random stream). 随机流基于它们的核心共享变量, 所以共享变量的使用方法在这里也通用. Theanos的随机对象通过RandomStreams 实现和调用, 更底层的则是在 RandomStreamsBase.
Brief Example(简单例子)
基本代码:
from theano.tensor.shared_randomstreams import RandomStreamsfrom theano import functionsrng = RandomStreams(seed=234)rv_u = srng.uniform((2,2))rv_n = srng.normal((2,2))f = function([], rv_u)g = function([], rv_n, no_default_updates=True) #Not updating rv_n.rngnearly_zeros = function([], rv_u + rv_u - 2 * rv_u)
这里的‘rv_u’ 代表一个2x2的基于平均分布的随机流矩阵. 同样的 ‘rv_n’ 代表一个2x2的基于正态分布的随机流矩阵. 分布的实现在RandomStreams 更底层的则在raw_random.
现在来使用这些对象吧. 如果我们调用f(), 我们就可以获得平均分布的数(4个). 随机数生成器的内部状态会自动更新, 所以每次调用的随机数都不一样.
>>> f_val0 = f()>>> f_val1 = f() #different numbers from f_val0
当我们加入额外的参数 no_default_updates=True (比如g), 随机数生成器的状态就不再变化了. 所以每次调用的随机数都是一样的.
>>> g_val0 = g() # different numbers from f_val0 and f_val1>>> g_val1 = g() # same numbers as g_val0!
需要注意的是, 一个随机变量在任何单个函数执行过程(single function execution)中最多抽取(draw)一次. 所以nearly_zeros function 可以保证每次都返回 0 的近似值(除了舍入误差), 尽管rv_u随机变量看似调用了3次.
>>> nearly_zeros = function([], rv_u + rv_u - 2 * rv_u)
Seeding Streams(种子流)
随机变量可以独立或整体设立种子.
你可以通过设置.rng属性来设置一个随机变量的种子, 只需要使用:.rng.set_value().
>>> rng_val = rv_u.rng.get_value(borrow=True) # 获取rv_u的rng值>>> rng_val.seed(89234) # 设置种子>>> rv_u.rng.set_value(rng_val, borrow=True) # 重新设置rng的值
可以使用对象的seed方法同时设置所有使用RandomStreams分配的随机变量. 这个种子会被用来设置一个临时随机数生成器, 使用它来生成每个随机变量的种子.
>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each
Sharing Streams Between Functions(函数间共享流)
和一般的共享变量一样, 用于随机变量的随机数生成器在函数间通用. 所以我们的nearly_zeros 函数会更新上面的 f 使用的生成器的状态.
举个栗子:
>>> state_after_v0 = rv_u.rng.get_value().get_state()>>> nearly_zeros() # this affects rv_u's generator>>> v1 = f()>>> rng = rv_u.rng.get_value(borrow=True)>>> rng.set_state(state_after_v0)>>> rv_u.rng.set_value(rng, borrow=True)>>> v2 = f() # v2 != v1>>> v3 = f() # v3 == v1
Copying Random State Between Theano Graphs(随机状态复制)
在一些例子中, 用户可能希望把所有和theano图(比如g1)相关的随机数生成器的状态传递到一个第二个图(如g2). 如果你想要基于一个先前模型的参数来初始化一个新模型的状态, 你就会碰到这个问题. 对于theano.tensor.shared_randomstreams.RandomStreams 以及theano.sandbox.rng_mrg.MRG_RandomStreams, 可以通过复制state_updates 参数的成员来解决这个问题.
每次从一个随机流对象中抽取一个随机变量时, 一个tuple就被加到state_updates 列表中. 第一个元素是一个共享变量, 代表着和指定变量相关的随机数生成器的状态, 第二个元素代表着和随机数生成过程相关的theano图(比如 RandomFunction{uniform}.0).
下面是一个随机状态如何从一个theano函数传递到另一个的例子:
import theanoimport numpyimport theano.tensor as Tfrom theano.sandbox.rng_mrg import MRG_RandomStreamsfrom theano.tensor.shared_randomstreams import RandomStreamsclass Graph(): def __init__(self, seed=123): self.rng = RandomStreams(seed) self.y = self.rng.uniform(size=(1,))g1 = Graph(seed=123)f1 = theano.function([], g1.y)g2 = Graph(seed=987)f2 = theano.function([], g2.y)print 'By default, the two functions are out of sync.'print 'f1() returns ', f1()print 'f2() returns ', f2()def copy_random_state(g1, g2): if isinstance(g1.rng, MRG_RandomStreams): g2.rng.rstate = g1.rng.rstate for (su1, su2) in zip(g1.rng.state_updates, g2.rng.state_updates): su2[0].set_value(su1[0].get_value())print 'We now copy the state of the theano random number generators.'copy_random_state(g1, g2)print 'f1() returns ', f1()print 'f2() returns ', f2()
This gives the following output:
# By default, the two functions are out of sync.f1() returns [ 0.72803009]f2() returns [ 0.55056769]# We now copy the state of the theano random number generators.f1() returns [ 0.59044123]f2() returns [ 0.59044123]
Other Random Distributions(其他分布)
其他的分布实现: other distributions implemented.
Other Implementations(其他实现)
这里有2个不同的实现, 分别基于 CURAND andMRG31k3p
A Real Example: Logistic Regression(对数回归)
前述的所有要素在这个实例中都应用到了.
import numpyimport theanoimport theano.tensor as Trng = numpy.randomN = 400feats = 784D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2))training_steps = 10000# Declare Theano symbolic variablesx = T.matrix("x")y = T.vector("y")w = theano.shared(rng.randn(feats), name="w")b = theano.shared(0., name="b")print "Initial model:"print w.get_value(), b.get_value()# Construct Theano expression graphp_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # Probability that target = 1prediction = p_1 > 0.5 # The prediction thresholdedxent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # Cross-entropy loss functioncost = xent.mean() + 0.01 * (w ** 2).sum()# The cost to minimizegw, gb = T.grad(cost, [w, b]) # Compute the gradient of the cost # (we shall return to this in a # following section of this tutorial)# Compiletrain = theano.function( inputs=[x,y], outputs=[prediction, xent], updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb)))predict = theano.function(inputs=[x], outputs=prediction)# Trainfor i in range(training_steps): pred, err = train(D[0], D[1])print "Final model:"print w.get_value(), b.get_value()print "target values for D:", D[1]print "prediction on D:", predict(D[0])
- Theano 0.6 文档[3] - 更多例子
- Theano Tutorial文档翻译(四) - 更多例子
- Theano 中文文档 0.9 - 7.2.2 更多示例
- Theano 0.6 文档[6] - Theano的微分[待完成]
- Theano 中文文档 0.9 - 7.2.3 Theano中的导数
- Theano 0.6 文档[1] - NumPy 复习
- Theano 0.6 文档[2] - 基本运算
- Theano 0.6 文档[4] - 图结构
- Theano 中文文档 0.9 - 3. Theano一览
- Theano 中文文档 0.9 - 5. 安装Theano
- Theano 中文文档 0.9 - 6. 更新Theano
- theano 3
- 【deep learning】Theano文档学习
- sql 更多文档
- iScroll下拉加载更多例子
- H5加载更多小例子
- 五个例子掌握theano.scan函数
- theano第四课(一些例子)
- 搭建android开发环境
- leetcode: Symmetric Tree
- Oracle 中如何手工提交Cluster Table的事务
- CString to string
- #define用法
- Theano 0.6 文档[3] - 更多例子
- Android中dip(dp)与px之间单位转换
- 创建一个用了OpenGL的ndk Android项目
- Java JDBC连接SQL Server数据库
- linux系统内存实际使用率
- VS2010 制作安装包
- [LeetCode]Remove Duplicates from Sorted List
- ThreadLocal 和 synchornized 两者的区别
- 异常处理:java.lang.UnsupportedClassVersionError: Bad version number in .class file