【发布时间】: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。如果扫描的内部函数导致向上或向下,则可能会发生这种情况。
为什么会这样? X 和 outputs_info 明确设置为 float32。添加它们的结果如何成为float64?
【问题讨论】:
-
我不知道为什么,但你可以试试
theano.config.floatX = 'float32'。 -
谢谢 - 效果很好,而且更清晰。似乎一定是 scan() 使用了我们看不到的类型化内部。希望我们能得到专家的解释。
-
是的,我想是的,不客气。