我希望得到tf.cholesky
关于其输入的渐变。截至目前,tf.cholesky
没有注册的渐变:
LookupError: No gradient defined for operation 'Cholesky' (op type: Cholesky)
用于生成此错误的代码是:
import tensorflow as tf
A = tf.diag(tf.ones([3]))
chol = tf.cholesky(A)
cholgrad = tf.gradients(chol, A)
虽然我可以自己计算渐变并注册它,但是我已经看到Cholesky渐变计算的唯一现有方法涉及the use of for loops and needs the shape of the input matrix.但是,据我所知,{ {3}}
获取输入矩阵A
的形状的一种可能的解决方法可能是使用:
[int(elem) for elem in list(A.get_shape())]
但如果A
的维度依赖于形状为TensorShape([Dimension(None)])
的TensorFlow占位符对象,则此方法不起作用。
如果有人知道如何计算和注册tf.cholesky
的渐变,我将非常感谢您的了解。
答案 0 :(得分:4)
我们在对这个问题的回答和评论中对此进行了一些讨论:TensorFlow cholesky decomposition。 它可能(?)可以移植Theano implementation of CholeskyGrad,只要它的语义实际上是你想要的。 Theano的基于Smith's "Differentiation of the Cholesky Algorithm"。
如果将它实现为Python调用的C ++操作,则可以无限制地访问所需的所有循环结构,以及Eigen提供的任何内容。如果你想在纯张量流中做到这一点,你可以使用控制流操作,例如tf.control_flow_ops.While
来循环。
一旦你知道你想申请的实际公式,答案就在这里:matrix determinant differentiation in tensorflow 展示了如何在张量流中实现和注册op的渐变。
您也可以create an issue on github申请此功能,但是,如果您自己实施此功能然后发送拉取请求,您可能会更快地获得此功能。 :)