用于铸造共享变量的Theano set_value

时间:2015-06-24 11:23:52

标签: python theano

在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之间的不同语法?我希望我的代码适用于这两种情况,我做错了吗?

1 个答案:

答案 0 :(得分:4)

这与另一个StackOverflow question中描述的问题非常类似。

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

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

而不是

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。