此代码用于计算矩阵的轨迹(基于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:在编译扫描的内部函数时遇到以下错误:变量IncSubtensor {Set;:int64:}。0(参数编号2)的初始状态(扫描命名法中的outputs_info
) dtype float32,而内部函数(fn
)的结果有dtype float64。如果扫描的内部功能导致向上或向下转发,则会发生这种情况。
为什么这样? X
和outputs_info
显式设置为float32。添加它们的结果如何变为float64?