博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Theano学习笔记(一)——代数
阅读量:6821 次
发布时间:2019-06-26

本文共 4214 字,大约阅读时间需要 14 分钟。

标量相加

import theano.tensor as Tfrom theano import functionx = T.dscalar('x')y = T.dscalar('y')z = x + yf = function([x, y], z)

输入定义两个符号变量来取代数值,输出是一个0维的numpy.ndarray数组。

 

矩阵相加

把输入类型换一下即可了,矩阵假设维数不同,会遵循NumPy的广播规则。

import theano.tensor as Tfrom theano import functionx = T.dmatrix('x')y = T.dmatrix('y')z = x + yf = function([x, y], z)

 

定义一个公式如:a ** 2 + b ** 2 + 2 * a* b

这里每一个变量都须要单独申明。

import theanoa = theano.tensor.vector()b = theano.tensor.vector()out = a ** 2 + b ** 2 + 2 * a * bf = theano.function([a,b],out)print f([0, 1],[1,2])>>> [ 1. 9.]

 

支持多输出

import theano.tensor as Tfrom theano import functiona, b = T.dmatrices('a', 'b')diff = a - babs_diff = abs(diff)diff_squared = diff**2f = function([a, b], [diff, abs_diff,diff_squared])print f([[1, 1], [1, 1]], [[0, 1], [2,3]])>>> [array([[ 1.,  0.],      [-1., -2.]]), array([[ 1.,  0.],      [ 1.,  2.]]), array([[ 1.,  0.],      [ 1.,  4.]])]

 

设置默认參数

和标准Python一样,缺省參数必须在非缺省之后,也能够定义缺省变量名。

import theano.tensor as Tfrom theano import functionfrom theano import Paramx, y = T.dscalars('x', 'y')z = x + yf = function([x, Param(y, default=1,name='by_name')],z)print f(33)print f(33, 2)print f(33,by_name=3)>>> 34.035.036.0

 

共享变量

为了在GPU上更好的性能,引入共享变量,以累加器为例。

import theano.tensor as Tfrom theano import functionfrom theano import sharedstate = shared(0)inc = T.iscalar('inc')accumulator = function([inc], state,updates=[(state, state+inc)])print state.get_value()accumulator(1)print state.get_value()accumulator(300)print state.get_value()state.set_value(-1)print accumulator(3)print state.get_value()>>> 01301-12

state的值在调用函数之后才刷新。并且能够定义多个函数共用同一个共享变量,比如这个减法器。

decrementor = function([inc], state,updates=[(state, state-inc)])print decrementor(2)print state.get_value()>>> 20

假设在某个函数中,共用了这个共享变量,可是又不想变动它的值,那么能够使用given參数替代这个变量。而旧的state不发生变化。

fn_of_state = state * 2 + incfoo = T.scalar(dtype=state.dtype)skip_shared = function([inc, foo],fn_of_state,                           givens=[(state,foo)])print skip_shared(1, 3)print state.get_value()>>> 70

 

产生随机数

和C中的srand()一样,都是伪随机数。

from theano import functionfrom theano.tensor.shared_randomstreamsimport RandomStreamssrng = 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)#假设以后一直用这组随机数,就不再更新nearly_zeros = function([], rv_u + rv_u- 2 * rv_u)print nearly_zeros()#函数每次运行仅仅获得一个随机数,即使表达式里面有3个随机数

种子流:上述2个随机变量,能够全局设定同一个种子,也能够是分别设定。

#分别设置,使用.rng.set_value()函数rng_val =rv_u.rng.get_value(borrow=True) # Get the rng for rv_urng_val.seed(89234) # seeds thegeneratorrv_u.rng.set_value(rng_val,borrow=True)#全局设置,使用.seed()函数srng.seed(902340)

函数间共享流

state_after_v0 =rv_u.rng.get_value().get_state()#保存调用前的statenearly_zeros()       # this affects rv_u's generatorv1 = f()#第一个调用,之后state会变化rng = rv_u.rng.get_value(borrow=True)rng.set_state(state_after_v0)#为其state还原rv_u.rng.set_value(rng, borrow=True)v2 = f()             # v2 != v1输出更新后state相应的随机数v3 = f()             # v3 == v1再次更新又还原成原来的state了

 

在2张Theano图间复制状态

import theanoimport numpyimport theano.tensor as Tfrom theano.sandbox.rng_mrg importMRG_RandomStreamsfrom theano.tensor.shared_randomstreamsimport RandomStreams class 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 functionsare 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 thetheano random number generators.'copy_random_state(g1, g2)print 'f1() returns ', f1()print 'f2() returns ', f2()#输出同样的随机值>>> By default, the two functions are outof sync.f1() returns  [ 0.72803009]f2() returns  [ 0.55056769]We now copy the state of the theanorandom number generators.f1() returns  [ 0.59044123]f2() returns  [ 0.59044123]

欢迎參与讨论并关注以及兴许内容继续更新哦~

转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!

你可能感兴趣的文章
c冒泡排序
查看>>
第十五篇、OC_同一个View实现两个手势响应
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Java软件架构设计慨论
查看>>
15-用户手册(GB8567——88)
查看>>
JAVA 访问WebRoot下的目录文件
查看>>
0913数据库约束之主键 外键 非空 默认值约束 唯一约束 级联操作 表与表之间的联系...
查看>>
微信 {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"}
查看>>
C#中的接口
查看>>
DataTable数据存入指定路径的Excel文件
查看>>
【Lua】特性和一些基础语法
查看>>
Jaxb2 实现JavaBean与xml互转
查看>>
easyui的 getSelections 与 getSelected 对比区别
查看>>
Android 所遇问题(一)
查看>>
[翻译svg教程]svg中的circle元素
查看>>
[转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
查看>>
linux内核段属性机制【转】
查看>>
eclipse设置系统字体
查看>>
seq命令
查看>>
微信小程序录音实现
查看>>