更改 theano 共享变量不影响内部的值
change theano shared variable do not effect the value of internal
共享变量有点问题。代码如下:
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
以上我都能看懂。但是reverse不行,如下:
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**
无法理解共享变量的逻辑,希望得到帮助
已在 theano-users mailing list 上回答。
共享变量包裹了一块内存,但不能保证在整个计算过程中只会使用用于初始化共享变量的那块内存。
borrow=True
应被视为一种提示,而不是在所有情况下都应遵循的明确指示。
在第一个示例中,共享变量包装了初始 numpy 数组,因为 borrow=True
。因此,更改 numpy 数组会更改共享变量的内容。但这不应该依赖并且是 Theano 编程的不良做法。
在第二个例子中,s_true+=1.0
是一个符号表达式。除了使 s_true
指向表示表达式而不是共享变量的对象之外,它实际上并没有改变内存中的任何状态。 print s_true.eval()
显示执行符号计算的结果,但不会更改共享变量。更改共享变量内容的唯一 "approved" 方法是通过 shared_var.set_value(...)
或通过 theano.function(...)
的 updates=...
机制。如第一个示例所示,更改后备存储有时会奏效,但并非总是如此,通常应避免。
第三个例子只是第一个例子的一种更迂回的方式,所以也是不好的做法。
This page in the documentation 可能会有帮助。
共享变量有点问题。代码如下:
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
以上我都能看懂。但是reverse不行,如下:
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**
无法理解共享变量的逻辑,希望得到帮助
已在 theano-users mailing list 上回答。
共享变量包裹了一块内存,但不能保证在整个计算过程中只会使用用于初始化共享变量的那块内存。
borrow=True
应被视为一种提示,而不是在所有情况下都应遵循的明确指示。
在第一个示例中,共享变量包装了初始 numpy 数组,因为 borrow=True
。因此,更改 numpy 数组会更改共享变量的内容。但这不应该依赖并且是 Theano 编程的不良做法。
在第二个例子中,s_true+=1.0
是一个符号表达式。除了使 s_true
指向表示表达式而不是共享变量的对象之外,它实际上并没有改变内存中的任何状态。 print s_true.eval()
显示执行符号计算的结果,但不会更改共享变量。更改共享变量内容的唯一 "approved" 方法是通过 shared_var.set_value(...)
或通过 theano.function(...)
的 updates=...
机制。如第一个示例所示,更改后备存储有时会奏效,但并非总是如此,通常应避免。
第三个例子只是第一个例子的一种更迂回的方式,所以也是不好的做法。
This page in the documentation 可能会有帮助。