我正在尝试使用Theano来计算关于向量以及几个标量的函数的粗糙度(编辑:也就是说,我基本上希望将标量附加到我正在计算粗体的向量上尊重)。这是一个最小的例子:
import theano
import theano.tensor as T
A = T.vector('A')
b,c = T.scalars('b','c')
y = T.sum(A)*b*c
我的第一次尝试是:
hy = T.hessian(y,[A,b,c])
哪个失败了AssertionError: tensor.hessian expects a (list of) 1 dimensional variable as 'wrt'
我的第二次尝试是将A,b和c与:
结合起来wrt = T.concatenate([A,T.stack(b,c)])
hy = T.hessian(y,[wrt])
哪个失败了DisconnectedInputError: grad method was asked to compute the gradient with respect to a variable that is not part of the computational graph of the cost, or is used only by a non-differentiable operator: Join.0
在这种情况下计算粗麻线的正确方法是什么?
更新:为了澄清我在寻找什么,假设A是2元素向量。那么黑森州就是:
[[d2y/d2A1, d2y/dA1dA2, d2y/dA1dB, d2y/dA1dC],
[d2y/dA2dA1, d2y/d2A2, d2y/dA2dB, d2y/dA2dC],
[d2y/dBdA1, d2y/dBdA2, d2y/d2B, d2y/dABdC],
[d2y/dCdA1, d2y/dCdA2, d2y/dCdB, d2y/d2C]]
示例函数y
应该是:
[[0, 0, C, B],
[0, 0, C, B],
[C, C, 0, A1+A2],
[B, B, A1+A2, 0]]
所以如果我们要定义一个函数:
f = theano.function([A,b,c], hy)
然后,假设我们可以成功计算hy
,我们期望输出:
f([1,1], 4, 5) =
[[0, 0, 5, 4],
[0, 0, 5, 4],
[5, 5, 0, 2],
[4, 4, 2, 0]]
在我的实际应用中,A有25个元素,y
更复杂,但想法是一样的。
答案 0 :(得分:1)
如果您将b,c
作为向量传递,它应该可以正常工作。粗麻布运算符期望1D阵列。尽管标量也应该起作用,但最简单的方法就是提供它喜欢的输入类型。
堆叠失败的原因是stack
操作在图的不同分支上产生一个新的非endnode变量,通常不能明确地获取衍生物。所以theano根本不允许这样做。
这对我有用:
import theano.tensor as T
A = T.vector('A')
b,c = T.vectors('b','c')
y = T.sum(A)*b[0]*c[0]
hy = T.hessian(y,[A,b,c])
答案 1 :(得分:1)
根据@eickenberg的建议将numpy级别的输入结合起来,我使用了以下解决方法:
var CLIN_list = new VBArray(wbA.Sheets("Control Form").Range("B62:B141").value).toArray();
给出预期的输出:
import theano
import theano.tensor as T
A,temp = T.vectors('A','T')
b,c = T.scalars('b','c')
y = T.sum(A)*b*c
y2 = theano.clone(y,{A:temp[:-2],b:temp[-2],c:temp[-1]})
hy = T.hessian(y2,[temp])
f = theano.function([temp], hy)
f([1,1,4,5])
如果有人知道更好(更通用)的解决方案,请联系我,但这样做有点尴尬。