Theano set_value 用于强制转换共享变量

Theano set_value for casted shared variable

Theano深度学习教程中,y是强制转换的共享变量:

   y = theano.shared(numpy.asarray(data, dtype=theano.config.floatX))
   y = theano.tensor.cast(y, 'int32')

稍后我想为 y 设置一个新值。

对于 GPU 这有效:

    y.owner.inputs[0].owner.inputs[0].set_value(np.asarray(data2, dtype=theano.config.floatX))

对于 CPU 这有效:

    y.owner.inputs[0].set_value(np.asarray(data2, dtype=theano.config.floatX))

为什么这需要 GPU 和 CPU 之间的不同语法?我希望我的代码适用于这两种情况,我做错了吗?

这个问题与另一个 中描述的问题非常相似。

问题是您正在使用 符号 强制转换操作将共享变量转换为符号变量。

解决方案是转换共享变量的值而不是共享变量本身。

而不是

y = theano.shared(numpy.asarray(data, dtype=theano.config.floatX))
y = theano.tensor.cast(y, 'int32')

使用

y = theano.shared(numpy.asarray(data, dtype='int32'))

通过 owner 属性导航 Theano 计算图被认为是错误的形式。如果要更改共享变量的值,请维护对共享变量的 Python 引用并直接设置其值。

因此,y 只是一个共享变量,而不是符号变量,您现在可以这样做:

y.set_value(np.asarray(data2, dtype='int32'))

请注意,转换再次发生在 numpy 中,而不是 Theano。