【问题标题】:Why does scan upcast?为什么扫描向上?
【发布时间】:2021-10-05 06:02:02
【问题描述】:

这个计算矩阵轨迹的代码(基于 Theano“循环”教程中的一个例子)工作正常:

import numpy as np
import theano as th
import theano.tensor as T
floatX = 'float32'
X = T.matrix()
results = th.scan(lambda i,j,t_f : T.cast(X[i,j] + t_f, floatX),
                      sequences=[T.arange(X.shape[0]), T.arange(X.shape[1])],
                      outputs_info=np.asarray(0., dtype=floatX))[0]
result = results[-1]
compute_trace = th.function([X], result)
x = np.eye(5, dtype=floatX)
x[0] = np.arange(5, dtype=floatX)
print compute_trace(x)

但是如果我像这样从 lambda 函数中删除强制转换操作:

lambda i,j,t_f : X[i,j] + t_f

产生以下错误信息:

ValueError:编译scan的内部函数时遇到以下错误:变量IncSubtensor{Set;:int64:}.0(参数号2)的初始状态(扫描命名法中的outputs_info)具有dtype float32 , 而内部函数 (fn) 的结果具有 dtype float64。如果扫描的内部函数导致向上或向下,则可能会发生这种情况。

为什么会这样? Xoutputs_info 明确设置为 float32。添加它们的结果如何成为float64?

【问题讨论】:

  • 我不知道为什么,但你可以试试theano.config.floatX = 'float32'
  • 谢谢 - 效果很好,而且更清晰。似乎一定是 scan() 使用了我们看不到的类型化内部。希望我们能得到专家的解释。
  • 是的,我想是的,不客气。

标签: python theano


【解决方案1】:

这是一个很晚的答案,但我们正在开发一个名为 Aesara 的 Theano 的分支,而且,由于人们仍然会遇到这样的问题,因此提供一个公开的解释似乎是值得的。

也就是说,问题是X = T.matrix()T.matrixtheano.config.floatX == "float64"(默认)时创建一个float64矩阵,结果是scan的循环函数主体中的总和向上转换为float64。

如果使用X = T.fmatrix(),则改为创建float32矩阵,问题不再存在;否则,如 cmets 中所述,也可以将 theano.config.floatX 设置为 "float32"

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多