我最近在Sympy中遇到了符号矩阵导数的一些性能瓶颈(具体来说,通过使用lambdas替换来评估符号矩阵的单行代码占用了程序运行时的约90%),所以我决定给Theano一个去。
它之前的应用是评估高斯过程的超参数的偏导数,其中使用Sympy符号(MatrixSymbol)的(1,k)维矩阵在迭代此列表和区分每个矩阵的方面很好地工作。项目
然而,这并没有延续到Theano,文档似乎没有详细说明如何做到这一点。在Theano中索引符号向量会返回Subtensor类型,该类型对于计算渐变而无效。
下面是一个简单的(但完全在算法上不正确 - 剥离到我试图获得的功能)我试图做的版本。
编辑:我修改了代码示例,将数据作为张量包含在下面建议的函数中,并包含了一个替代尝试,而是使用单独的标量张量列表,因为我无法索引a的值象征性的Theano载体虽然也无济于事。
import theano
import numpy as np
# Sample data
data = np.array(10*np.random.rand(5, 3), dtype='int64')
# Not including data as tensor, incorrect/invalid indexing of symbolic vector
l_scales_sym = theano.tensor.dvector('l_scales')
x = theano.tensor.dmatrix('x')
f = x/l_scales_sym
f_eval = theano.function([x, l_scales_sym], f)
df_dl = theano.gradient.jacobian(f.flatten(), l_scales_sym[0])
df_dl_eval = theano.function([x, l_scales_sym], df_dl)
代码片段的第二行是我试图获得“长度缩放”变量列表中某个元素的偏导数,但这种索引不适用于符号向量。
非常感谢任何帮助!
答案 0 :(得分:2)
使用theano时,所有变量都应定义为theano tensors(或共享变量);否则,变量不会成为计算图的一部分。在f = data/l_scales_sym
中,变量data
是一个numpy数组。尝试将其定义为张量,它应该工作。