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