7

通过阅读 TensorFlow 文档,我看到有一种方法可以计算方阵的 Cholesky 分解。但是,通常当我想使用 Cholesky 分解时,我这样做是为了解决直接矩阵求逆可能不稳定的线性系统。

因此,我正在寻找一种类似于在Scipy中实现的方法。有谁知道这在 TensorFlow 中是否存在,或者是否有办法将其合并?

4

2 回答 2

3

更新 (2017/04/23)

TensorFlow 现在有许多线性代数运算。例如,结帐tf.cholesky_solvetf.matrix_solve_lstf.matrix_solvetf.qrtf.svd等。当然,下面的原始答案也可能会有所帮助。

原创 matrix_inverse你需要的吗?它使用 Cholesky 或 LU 分解,具体取决于输入。例如,

>>> 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.]]
于 2015-12-05T23:04:24.410 回答
3

user19..8:如果您想在 tensorflow 中“大部分”保留内容,那么现在执行此操作的方法是执行您和 Berci 在评论中讨论的内容:运行 tensorflow 图,直到您需要解决线性系统,然后使用 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,这将造成性能瓶颈,但它也可能很好 - 很大程度上取决于您的设置。

于 2015-11-14T18:29:11.287 回答