在Theano中使用循环定义函数

时间:2014-07-31 11:40:05

标签: python numpy scipy theano

我想在Theano中定义以下两个变量的函数并计算其雅可比行列式:

f(x1,x2) = sum((2 + 2k - exp(k*x1) - exp(k*x2))^2, k = 1..10)

如何为上述表达式创建Theano函数 - 并最终使用雅可比行列式最小化它?

1 个答案:

答案 0 :(得分:3)

由于你的函数是标量,雅可比矩阵会减少到渐变。假设你的两个变量x1, x2是标量(从公式看起来很容易推广到其他对象),你可以写

import theano
import theano.tensor as T

x1 = T.fscalar('x1')
x2 = T.fscalar('x2')

k = T.arange(1, 10)

expr = ((2 + 2 * k - T.exp(x1 * k) - T.exp(x2 * k)) ** 2).sum()

func = theano.function([x1, x2], expr)

您可以在两个标量上调用func

In [1]: func(0.25,0.25)
Out[1]: array(126.5205307006836, dtype=float32)

然后是渐变(雅可比)

grad_expr = T.grad(cost=expr, wrt=[x1, x2])

你可以在标准方式updates中使用theano.function(参见theano教程)来制作渐变下降,将x1, x2设置为givens中的共享变量,手动编写python级别,或使用其他人指定的scan