在Theano中用循环定义函数

我想在Theano中定义两个变量的以下函数并计算其Jacobian值:

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

如何为上述表达式创建Theano函数-最终使用其Jacobian函数将其最小化?

解决方法:

由于您的函数是标量,因此雅可比矩阵减小为梯度.假设您的两个变量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)

则梯度(Jacobian)为

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

而且,您可以以标准方式(请参见theano教程)在theano.function中使用更新,以进行梯度下降,在python级别手动设置x1,x2作为给定值中的共享变量,或使用其他人指定的scan.

上一篇:python-具有numpy的N * M * M张量的矢量化(部分)逆


下一篇:圆圆的读书报告