theano中的TensorSharedVariable在函数中被初始化了两次吗?

is TensorSharedVariable in theano initilized twice in function?

在theano中,sharedvarialbe一旦在一个函数中被初始化,即使重复访问该函数也不会再被初始化,对吗?

def sgd_updates_adadelta(params,cost,rho=0.95,epsilon=1e-6,norm_lim=9,word_vec_name='Words'):

updates = OrderedDict({})
exp_sqr_grads = OrderedDict({})
exp_sqr_ups = OrderedDict({})
gparams = []
for param in params:
    empty = np.zeros_like(param.get_value())
    exp_sqr_grads[param] = theano.shared(value=as_floatX(empty),name="exp_grad_%s" % param.name)
    gp = T.grad(cost, param)    
    exp_sqr_ups[param] = theano.shared(value=as_floatX(empty), name="exp_grad_%s" % param.name)
    gparams.append(gp)

上面代码中,exp_sqr_grads变量和exp_sqr_ups变量在第二次调用sgd_updates_adadelta函数时不会再次初始化为零?

共享变量不是静态的,如果那是你的意思。我对你的代码的理解:

import theano
import theano.tensor as T

global_list = []

def f():

    a = np.zeros((4, 5), dtype=theano.config.floatX)
    b = theano.shared(a)
    global_list.append(b)

将其复制并粘贴到 IPython 中,然后尝试:

f()
f()

print global_list

该列表将包含两项。它们不是同一个对象:

In [9]: global_list[0] is global_list[1]
Out[9]: False

而且它们指的不是同一个内存:Do

global_list[0].set_value(np.arange(20).reshape(4, 5).astype(theano.config.floatX))

然后

In [20]: global_list[0].get_value()
Out[20]: 
array([[  0.,   1.,   2.,   3.,   4.],
       [  5.,   6.,   7.,   8.,   9.],
       [ 10.,  11.,  12.,  13.,  14.],
       [ 15.,  16.,  17.,  18.,  19.]])

In [21]: global_list[1].get_value()
Out[21]: 
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

已经确定多次初始化共享变量会导致不同的变量,这里是如何使用函数更新共享变量。我们重新使用建立的共享变量:

s = global_list[1]
x = T.scalar(dtype=theano.config.floatX)
g = theano.function([x], [s], updates=[(s, T.inc_subtensor(s[0, 0], x))])

g 现在在每次调用时将 s 的左上角值递增 x

In [7]: s.get_value()
Out[7]: 
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

In [8]: g(1)
Out[8]: 
[array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])]

In [9]: s.get_value()
Out[9]: 
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

In [10]: g(10)
Out[10]: 
[array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])]

In [11]: s.get_value()
Out[11]: 
array([[ 11.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.]])