我对使用 TensorFlow 计算矩阵行列式的导数很感兴趣。我从实验中可以看出,TensorFlow 没有实现通过行列式进行区分的方法:
LookupError: No gradient defined for operation 'MatrixDeterminant'
(op type: MatrixDeterminant)
进一步调查表明,实际上可以计算导数。例如,参见Jacobi 公式。我确定,为了实现这种通过行列式进行区分的方法,我需要使用函数装饰器,
@tf.RegisterGradient("MatrixDeterminant")
def _sub_grad(op, grad):
...
但是,我对张量流不够熟悉,无法理解如何实现这一点。有人对此事有任何见解吗?
这是我遇到此问题的示例:
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)