TensorFlow cholesky分解

时间:2015-11-14 14:43:30

标签: scipy tensorflow

通过阅读TensorFlow文档,我发现有一种计算Cholesky decomposition of a square matrix的方法。但是,通常当我想使用Cholesky分解时,我这样做的目的是求解直接矩阵求逆可能不稳定的线性系统。

因此,我正在寻找一种类似于Scipy中实现的方法。有没有人知道TensorFlow中是否存在这种情况,或者是否有某种方式可以合并?

2 个答案:

答案 0 :(得分:3)

user19..8:如果你想在“张量流”中“保持”大部分内容,那么现在的方法就是做你和Berci在评论中讨论的内容:运行张量流图直到你需要的地方解决线性系统,然后用feed_dict返回结果。在伪代码中:

saved_tensor1 = tf.Variable(...)
saved_tensor2 = tf.Variable(...)

start_of_model...
tensor1, tensor2 = various stuff...
do_save_tensor1 = saved_tensor1.assign(tensor1)
do_save_tensor2 = saved_tensor2.assign(tensor2)
your_cholesky = tf.cholesky(your_other_tensor, ...)

## THIS IS THE SPLIT POINT
# Second half of your model starts here
solved_system = tf.placeholder(...)  # You'll feed this in with feed_dict
final_answer = do_something_with(saved_tensor1, saved_tensor2, solved_system)

然后运行整个事情,做:

_, _, cho = tf.run([do_save_tensor1, do_save_tensor2, your_cholesky])
solution = ... solve your linear system with scipy ...
feed_dict = {solved_system: solution}
answer = tf.run(final_answer, feed_dict=feed_dict)

此处的关键是将中间结果存储在tf.Variables中,以便您可以在之后恢复计算。

(我不承诺你从tf.cholesky得到的东西是正确的格式直接喂给scipy,或者你不应该只是在早期的步骤中拉出矩阵并将其提供给scipy,但这个整体工作流程应该适合你。)

请注意,如果您正在进行大量多核或GPU操作,然后必须将矩阵吐出到scipy,这会产生性能瓶颈,但它可能也很好 - 取决于您的设置。< / p>

答案 1 :(得分:3)

更新(2017/04/23)

TensorFlow现在有很多linear algebra operations。例如,结帐tf.cholesky_solvetf.matrix_solve_lstf.matrix_solvetf.qrtf.svd等。当然,下面的原始答案也可能有所帮助。< / p>

<强>原始 matrix_inverse做你需要的吗?它使用Cholesky或LU Decomposition,具体取决于输入。例如,

>>> import tensorflow as tf
>>> x = [[1.,1.],[-2.,3.],[1.,-1.]]
>>> y = [[-1.],[-8.],[3.]]
>>> a = tf.matrix_inverse(tf.matmul(x, x, transpose_a=True))
>>> b = tf.matmul(tf.matmul(a, x, transpose_b=True), y)
>>> with tf.Session():
...   print b.eval()
... 
[[ 1.]
 [-2.]]