2015-04-11 3 views
0

В anano, как только sharedvarialbe инициализируется в одной функции, он никогда не будет инициализирован снова, даже если функция будет доступна повторно, верно?TensorSharedVariable в anano, инициализированном дважды в функции?

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 называется второй раз?

+0

Это не правильный код питона. Все, что вы написали в строке 'def', которая должна быть в функции? Пожалуйста, отредактируйте его соответствующим образом. – eickenberg

ответ

0

Общие переменные не являются статическими, если это то, что вы имеете в виду. Мое понимание кода:

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 

И они не относятся к одной и той же памяти: У

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

извините за код, спасибо большое! – Bevan

+0

Отвечает ли это на ваш вопрос? Это не совсем понятно. Если это так, вы должны нажать кнопку «Принять». Если нет, добавьте разъяснения. – eickenberg

+0

Не совсем то, что я ожидал. Но я думаю, что понял это. В anano общие переменные инициализируются только один раз, когда функция обновления в anano компилируется. Я прав? – Bevan

Смежные вопросы