2015-04-11 1 views
0

Ainsi, une fois le sharedvarialbe initialisé dans une fonction, il ne sera jamais initialisé à nouveau, même si la fonction est accédée à plusieurs reprises, ai-je raison?est TensorSharedVariable dans theano initilized deux fois en fonction?

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) 

Dans le code ci-dessus, la variable exp_sqr_grads et la variable exp_sqr_ups ne sera pas initialisé avec des zéros à nouveau lorsque la fonction est appelée sgd_updates_adadelta la deuxième fois?

+0

Ce n'est pas le code Python valide. Tout ce que vous avez écrit sous la ligne 'def' est-il supposé être dans la fonction? Veuillez le modifier en conséquence. – eickenberg

Répondre

0

Les variables partagées ne sont pas statiques, si c'est ce que vous voulez dire. Ma compréhension de votre code:

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) 

Copiez et collez ce dans un IPython puis essayer:

f() 
f() 

print global_list 

La liste contient deux articles. Ils ne sont pas le même objet:

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

Et ils ne font pas référence à la même mémoire: Est-ce

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

Puis

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.]]) 

Après avoir établi que l'initialisation des variables partagées plusieurs fois leads Pour différentes variables, voici comment mettre à jour une variable partagée en utilisant une fonction. Nous réutilisons les variables partagées établies:

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 incréments maintenant la valeur en haut à gauche de s par x à chaque appel:

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.]]) 
+0

désolé pour le format de code, merci beaucoup! – Bevan

+0

Est-ce que cela répond à votre question? Ce n'est pas tout à fait clair. Si c'est le cas, vous devez cliquer sur le bouton Accepter. Sinon, veuillez ajouter des clarifications. – eickenberg

+0

Pas exactement ce à quoi je m'attendais. Mais je pense que je l'ai compris. Dans ce cas, les variables partagées ne sont initialisées qu'une seule fois lorsque la fonction de mise à jour dans theano est compilée. Ai-je raison? – Bevan