【问题标题】:Computing jacobian matrix in Tensorflow在 Tensorflow 中计算雅可比矩阵
【发布时间】:2018-05-09 01:29:00
【问题描述】:

我想通过 Tensorflow 计算雅可比矩阵。

我有什么:

def compute_grads(fn, vars, data_num):
    grads = []
    for n in range(0, data_num):
        for v in vars:
            grads.append(tf.gradients(tf.slice(fn, [n, 0], [1, 1]), v)[0])
    return tf.reshape(tf.stack(grads), shape=[data_num, -1])

fn是损失函数,vars都是可训练的变量,data_num是数据的数量。

但是如果我们增加数据的数量,运行函数compute_grads会花费大量时间。 有什么想法吗?

【问题讨论】:

  • 您是否对代码进行了基准测试?除非您知道要改进什么,否则您无法改进它。
  • 请参阅issue #675,了解有关如何在 TensorFlow 中计算雅可比行列式的讨论。一般来说,没有“好方法”来做到这一点。
  • 感谢您的评论。我按照问题实现了 Levenberg-Marquardt 算法,但是计算时间比用 c++ 实现的 ceres 求解器慢...

标签: python tensorflow gradient


【解决方案1】:

假设XY 是Tensorflow 张量并且Y 依赖于X

from tensorflow.python.ops.parallel_for.gradients import jacobian
J=jacobian(Y,X)

结果的形状为Y.shape + X.shape,并提供Y 的每个元素相对于X 的每个元素的偏导数。

【讨论】:

  • 你的意思是 Y.shape * X.shape ?
  • 没有。此上下文中的 + 符号是元组连接(即 a1,a2..,an,b1,b2.,...,bn)。
  • ... 也就是说(a,b) 表示a*b 数字,因此(a,b)+(c,d)=(a,b,c,d) 表示a*b*c*d 数字。
【解决方案2】:

假设您使用的是 Tensorflow 2 或 Tensorflow

with tf.GradientTape() as g:
  x  = tf.constant([1.0, 2.0])
  g.watch(x)
  y = x * x
jacobian = g.jacobian(y, x)
# jacobian value is [[2., 0.], [0., 4.]]

查看official documentation 了解更多信息

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2020-07-14
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多