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