关闭

Theano——shared

391人阅读 评论(0) 收藏 举报
分类:

  Theano的shared类似于全局变量的概念,其值将会在多个函数中共用。如在softmax实现中,w, b都是shared变量。

     我们先给出theano中的最简单的例子:

>>> from theano import shared

>>> from theano import function

>>> import theano.tensor as T

>>> state = shared(0)         ----->shared变量state

>>> inc = T.iscalar('inc')      ----> 整形标量inc

>>> acc = function([inc],state, updates=[(state, state+inc)])     ---> 定义function, 输入inc, 输出state, state采用state+inc更新

>>> state.get_value()          ----> 获取shared变量state的值

0

>>> acc(1)                             --->调用acc, 不过输出值是未更新前的state, 即0

array(0) 

>>> state.get_value()          ----> 更新后的state的值1

1

>>> state.set_value(10)     ----> 设置state的值

>>> acc(10)    

10

>>> state.get_value()

20

类似的,我们可以定义矩阵类型的shared变量

>>>state = shared(zeros([3,3]))

>>>inc = T.dmatrix('inc')

>>> acc = function([inc], state, updates=[(state, state + inc)])

>>> acc([[1,2,3],[1,2,3],[1,2,3]])

array([[0., 0., 0.],

           [0., 0., 0.],

           [0., 0., 0.]]

>>>state.get_value()

array([[1., 2., 3.],

           [1., 2., 3.],          

           [1., 2., 3.]]


shared variable是一种符号变量(symbolic variable),但是这个symbolic variable又拥有自己的值。

假设你定义了一个shared variable叫做a:
import theano
a = theano.shared(2, "a")
那么a就是一个symbolic variable,目前的初始值是2

现在你定义两个theano.function,一个实现加二的功能,一个实现平方的功能:
i = theano.tensor.scalar("i", dtype=theano.config.floatX)
add_two_func = theano.function(inputs=[i], outputs=[i+a])
sqr_func = theano.function(inputs=[i], outputs=[i**a])

i作为一个输入变量,通过theano.tensor.scalar来定义。i也是一个symbolic variable,但是它在定义的时候没有一个固定的值。

现在开始实际调用加二的函数和平方的函数:
>>> add_two_func(3)
[array(5.0)]
>>> sqr_func(4)
[array(16.0)]

i在调用函数的时候,才被赋值。在上例中,i第一次被赋值了3,第二次被赋值了4。而a作为symbolic variable,却在定义的时候就已经拥有了值:2 。

a之所以叫shared variable是因为a的赋值在不同的函数中都是一致的,即a是被shared的。在上例中a的值在不同的函数中都为2。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:58322次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:133篇
    • 译文:9篇
    • 评论:6条