在Theano中使用循环定义函数

3

我想在Theano中定义以下两个变量的函数并计算它的雅各比矩阵:

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

如何创建一个 Theano 函数来计算上述表达式,并最终使用它的 Jacobian 进行最小化处理?


说到雅可比矩阵,您是指雅可比矩阵的行列式吗? - psukys
你看过Theano教程了吗? - ali_m
特别是要看一下scan - ali_m
有一种方法可以计算雅可比矩阵。扫描文档展示了如何手动完成:http://deeplearning.net/software/theano/library/gradient.html#theano.gradient.jacobian - nouiz
1个回答

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)

梯度(Jacobian)是这样的:
grad_expr = T.grad(cost=expr, wrt=[x1, x2])

您可以在theano.function中按照标准方式(请参见Theano教程)使用updates来进行梯度下降,将x1, x2作为共享变量在givens中手动设置,或者按照其他人的指示使用scan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接