更改theano共享变量不会影响内部的值

时间:2015-11-27 10:45:36

标签: python theano

我对共享变量有点问题。代码如下:

np_array = numpy.ones(2, dtype='float32')
s_true = theano.shared(np_array,borrow=True)
np_array+=1.
print s_true.get_value()#[ 2.  2.] change np_array will change s_true

我能理解上面的内容。但反向不起作用,如下所示:

np_array = numpy.ones(2, dtype='float32')
s_true = theano.shared(np_array,borrow=True)
s_true+=1.0
print s_true.eval()   #[ 2.  2.]
np_array  #array([ 1.,  1.], dtype=float32) **change s_true will not change np_array**

但是,以下工作:

s_true = theano.shared(np_array,borrow=True)
v_true=s_true.get_value(borrow=True,return_internal_type=True)
v_true+=1.0
print s_true.get_value() #[ 2.  2.] **change v_true will change s_true**  
np_array #array([ 2.,  2.], dtype=float32) **change v_true will change np_array**

我无法理解共享变量的逻辑,希望得到帮助

1 个答案:

答案 0 :(得分:1)

回答theano-users mailing list

共享变量包装了一块内存,但不能保证在整个计算过程中只使用用于初始化共享变量的内存块。

borrow=True应该被视为一种暗示,而不是在所有情况下都要遵循的明确指示。

在第一个示例中,共享变量包装了初始numpy数组,因为borrow=True。因此,更改numpy数组会更改共享变量的内容。但这不应该被依赖,并且对于Theano编程来说是不好的做法。

在第二个例子中,s_true+=1.0是一个符号表达式。除了使s_true指向表示表达式的对象而不是共享变量之外,它实际上不会更改内存中的任何状态。 print s_true.eval()显示执行符号计算的结果,但不会更改共享变量。唯一的#34;批准"更改共享变量内容的方法是shared_var.set_value(...)updates=... theano.function(...)机制。与第一个示例一样,更改后备存储有时会起作用,但并非总是如此,通常应该避免使用。

第三个例子只是一个更迂回的方式来做第一个例子,所以又是不好的做法。

This page in the documentation可能会有所帮助。