2015-11-27 30 views
4

我想獲得有關其輸入的tf.cholesky的梯度。作爲時刻,在tf.cholesky沒有註冊的梯度: TensorFlow中的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.

一po ssible解決方法,以獲取輸入矩陣A的形狀很可能是使用:

[int(elem) for elem in list(A.get_shape())] 

但如果A尺寸取決於與形狀TensorShape([Dimension(None)])一個TensorFlow佔位符對象這種方法是行不通的。

如果任何人有任何想法如何計算並註冊tf.cholesky的梯度,我會非常感激知道它。

回答

4

我們在這個問題的答案和評論中有一點討論過:TensorFlow cholesky decomposition。 它可能(?)有可能移植Theano implementation of CholeskyGrad,只要它的語義實際上是你想要的。 Theano's基於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來請求這個功能,當然,如果你自己實現它然後發送一個拉取請求,你可能會得到更快的速度。 :)

+0

謝謝! Theano/Smith的方法就是我所追求的。我會給控制流操作一個鏡頭,並提交一個C++實現的github請求:) –