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似乎添加了一个额外的节点,因此需要返回两步而不是一步。你知道这可能来自哪里吗? 可能是HostFromGpuGpuFromHost 操作。如果图表是通过theano.printing.debugprint 打印的,那么您将能够看到额外的操作是什么。这就是为什么最好避免在不需要时访问输入/输出/所有者的部分原因。 所以本教程是这样进行转换的,因为: # 在 GPU 上存储数据时,它必须存储为浮点数 # 因此我们也将标签存储为 floatX # (shared_y正是这样做的)。但是在我们的计算过程中,我们需要将它们作为整数(我们使用标签作为索引,如果它们是浮点数则没有意义),因此我们必须将其转换为整数,而不是返回 #shared_y。这个小技巧#让我们解决了这个问题

以上是关于Theano set_value 用于强制转换的共享变量的主要内容,如果未能解决你的问题,请参考以下文章

keras 后端 theano/tensorflow

深入理解C++中五种强制类型转换的使用场景

深入理解C++中五种强制类型转换的使用场景

深入理解C++中五种强制类型转换的使用场景

强制类型转换

JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES