- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想获得 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.然而,据我所知,symbolic loops aren't currently available to TensorFlow.
获取输入矩阵 A
形状的一种可能的解决方法可能是使用:
[int(elem) for elem in list(A.get_shape())]
但如果 A
的维度依赖于形状为 TensorShape([Dimension(None)])
的 TensorFlow 占位符对象,则此方法不起作用。
如果有人知道如何计算和注册 tf.cholesky
的梯度,我将不胜感激。
最佳答案
我们在这个问题的答案和评论中对此进行了一些讨论:TensorFlow cholesky decomposition .可能(?)可以移植 Theano implementation of CholeskyGrad ,前提是它的语义实际上是你想要的。 Theano 的基于 Smith's "Differentiation of the Cholesky Algorithm" .
如果您将其实现为 Python 刚刚调用的 C++ 操作,您可以不受限制地访问您可能需要的所有循环结构,以及 Eigen 提供的任何内容。如果您想在纯 TensorFlow 中执行此操作,则可以使用控制流操作,例如 tf.control_flow_ops.While
循环。
一旦您知道要应用的实际公式,答案就在这里:matrix determinant differentiation in tensorflow展示了如何在 tensorflow 中为操作实现和注册梯度。
你也可以 create an issue on github当然,要请求此功能,如果您自己实现它然后发送拉取请求,您可能会更快地获得它。 :)
关于python - TensorFlow 中的 Cholesky 因子分化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33962959/
我是一名优秀的程序员,十分优秀!