我有兴趣使用TensorFlow计算矩阵行列式的导数.我可以从实验中看出,TensorFlow尚未实现通过行列式区分的方法:
LookupError: No gradient defined for operation 'MatrixDeterminant'
(op type: MatrixDeterminant)
Run Code Online (Sandbox Code Playgroud)
进一步的调查显示,实际上可以计算导数; 例如,参见Jacobi的公式.我确定为了实现这种通过决定因素来区分我需要使用函数装饰器的方法,
@tf.RegisterGradient("MatrixDeterminant")
def _sub_grad(op, grad):
...
Run Code Online (Sandbox Code Playgroud)
但是,我对张量流不熟悉,无法理解如何实现这一目标.有没有人对此事有任何见解?
这是我遇到这个问题的一个例子:
x = tf.Variable(tf.ones(shape=[1]))
y = tf.Variable(tf.ones(shape=[1]))
A = tf.reshape(
tf.pack([tf.sin(x), tf.zeros([1, ]), tf.zeros([1, ]), tf.cos(y)]), (2,2)
)
loss = tf.square(tf.matrix_determinant(A))
optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for step in xrange(100):
sess.run(train)
print sess.run(x)
Run Code Online (Sandbox Code Playgroud) 我想获得tf.cholesky关于其输入的梯度。截至目前,tf.cholesky还没有注册渐变:
LookupError: No gradient defined for operation 'Cholesky' (op type: Cholesky)
Run Code Online (Sandbox Code Playgroud)
用于生成此错误的代码是:
import tensorflow as tf
A = tf.diag(tf.ones([3]))
chol = tf.cholesky(A)
cholgrad = tf.gradients(chol, A)
Run Code Online (Sandbox Code Playgroud)
虽然我可以自己计算梯度并注册它,但我见过计算 Cholesky 梯度的唯一现有方法涉及使用 for 循环并需要输入矩阵的形状。但是,据我所知,符号循环目前不适用于 TensorFlow。
获取输入矩阵形状的一种可能的解决方法A可能是使用:
[int(elem) for elem in list(A.get_shape())]
Run Code Online (Sandbox Code Playgroud)
但是,如果 的尺寸A依赖于具有 shape 的 TensorFlow 占位符对象,则此方法不起作用TensorShape([Dimension(None)])。
如果有人对如何计算和注册 的梯度有任何想法tf.cholesky,我将非常感谢您了解它。