Python 2.7 转换后无法更新共享张量变量的子集

Python 2.7 转换后无法更新共享张量变量的子集,python-2.7,numpy,theano,Python 2.7,Numpy,Theano,我有以下代码: import theano.tensor as T Words = theano.shared(value = U, name = 'Words') zero_vec_tensor = T.vector() zero_vec = np.zeros(img_w, dtype = theano.config.floatX) set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(W

我有以下代码:

import theano.tensor as T

Words = theano.shared(value = U, name = 'Words')
zero_vec_tensor = T.vector()
zero_vec = np.zeros(img_w, dtype = theano.config.floatX)
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0,:], zero_vec_tensor))])
编译很好(其中
U
是一个数据类型为
float64
的numpy数组)

为了防止将来出现类型错误,我想将我的共享张量
Words
转换为
float32
(或
theano.config.floatX
,这与我在配置文件中将
floatX
设置为
float32
相当)

因此,我添加了
Words=T.cast(Words,dtype=theano.config.floatX)
,然后我得到了以下错误:

TypeError:('updatetarget必须是SharedVariable',Elemwise{Cast{float32}}.0)

我不明白为什么。根据这一点,使用
set_subsensor
应该允许我更新共享变量的子集

U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])
U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
Words = T.cast(Words, dtype = theano.config.floatX)
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])

如何在能够更新共享张量的同时对其进行强制转换?

问题在于您试图更新的是符号变量,而不是共享变量

U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])
U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
Words = T.cast(Words, dtype = theano.config.floatX)
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])
工作正常,因为您正在更新的内容,
Words
是一个共享变量

U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])
U = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
Words = theano.shared(value=U, name='Words')
Words = T.cast(Words, dtype = theano.config.floatX)
zero_vec_tensor = T.vector()
set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0, :], zero_vec_tensor))])
不起作用,因为现在Word不再是共享变量,它是一个符号变量,在执行时,将计算一个强制转换,将共享变量中的值转换为
theano.config.floatX

共享变量的
dtype
由分配给它的值决定。因此,您可能只需要更改U的类型:

U = np.array([[1, 2, 3], [4, 5, 6]], dtype=theano.config.floatX)
或者使用numpy而不是象征性地投射:

U = np.dtype(theano.config.floatX).type(U)