1

是否有在 Tensorflow 中用稀疏三角矩阵求解 Ax = b 的实现?(对应于 tf.matrix_triangular_solve())

AFAIK,例如,如果我们有 A 作为具有稀疏矩阵表示的下三角矩阵,我们需要使用 tf.sparse_to_dense() 将其转换为密集矩阵。

但是,如果 A 的维度非常大,例如 16416x16416,并且条目非常稀疏,例如 0.018%(大约 45216 个非零),则将占用大量内存。

我认为如果我们可以在 Tensorflow 中利用稀疏矩阵求解器(例如具有带状结构的矩阵)将非常有帮助。

对不起,如果我的问题不相关。例如,如果对此有任何解决方案,我将不胜感激。

谢谢。

4

2 回答 2

2

我有同样的问题,我为它创建了一个自定义操作。只要您不想将梯度计算为 A 并且 A 保持不变,那么这段代码应该会有所帮助:

import tensorflow as tf
import numpy as np
from scipy.sparse import linalg as sla
import scipy

lu = sla.splu(A)

# Define custom py_func which takes also a grad op as argument:
def py_func(func, inp, Tout, stateful=True, name=None, grad=None):

    rnd_name = 'PyFuncGrad' + str(np.random.randint(0, 1E+8))

    tf.RegisterGradient(rnd_name)(grad)
    g = tf.get_default_graph()
    with g.gradient_override_map({"PyFunc": rnd_name}):
        return tf.py_func(func, inp, Tout, stateful=stateful, name=name)


def sparse_solve(x, lu, dtype=tf.float64, name=None):

    with tf.name_scope(name, 'SparseSolve', [x]) as name:
        solve_x = py_func(lu.solve,
                        [x],
                        [dtype],
                        name=name,
                        grad=_SparseSolveGrad(dtype, lu))
        return solve_x[0]

class _SparseSolveGrad:
    def __init__(self, dtype, lu):
        self.dtype = dtype
        self.lu = lu

    def __call__(self, op, grad):
        x = op.inputs[0]
        y = tf.conj(tf.py_func(self.lu.solve, [tf.conj(grad)], self.dtype))
        return y

该解决方案基于我在https://gist.github.com/harpone/3453185b41d8d985356cbe5e57d67342找到的代码

至少对我来说,解决方案非常快。如果您发现错误(例如在梯度计算中),请告诉我

于 2017-10-24T14:50:21.770 回答
0

TF 中对稀疏张量的支持很少。所以你目前唯一的方法(正如你已经确定的那样)是tf.sparse_to_dense()

于 2017-07-12T10:04:42.930 回答