Theano set_value 用于强制转换的共享变量
Posted
技术标签:
【中文标题】Theano set_value 用于强制转换的共享变量【英文标题】:Theano set_value for casted shared variable 【发布时间】:2015-06-24 11:23:52 【问题描述】:在 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】:这与另一个*** question 中描述的问题非常相似。
问题是您正在使用 symbolic 转换操作,它将共享变量转换为符号变量。
解决方案是强制转换共享变量的值,而不是共享变量本身。
而不是
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。
【讨论】:
OP中奇怪的是CPU和GPU之间存在差异-GPU似乎添加了一个额外的节点,因此需要返回两步而不是一步。你知道这可能来自哪里吗? 可能是HostFromGpu
或GpuFromHost
操作。如果图表是通过theano.printing.debugprint
打印的,那么您将能够看到额外的操作是什么。这就是为什么最好避免在不需要时访问输入/输出/所有者的部分原因。
所以本教程是这样进行转换的,因为: # 在 GPU 上存储数据时,它必须存储为浮点数 # 因此我们也将标签存储为 floatX
# (shared_y
正是这样做的)。但是在我们的计算过程中,我们需要将它们作为整数(我们使用标签作为索引,如果它们是浮点数则没有意义),因此我们必须将其转换为整数,而不是返回 #shared_y
。这个小技巧#让我们解决了这个问题以上是关于Theano set_value 用于强制转换的共享变量的主要内容,如果未能解决你的问题,请参考以下文章