【问题标题】:Sparse matrix triangular solve in Tensorflow?Tensorflow中的稀疏矩阵三角求解?
【发布时间】:2017-07-12 08:26:54
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: memory tensorflow sparse-matrix linear-equation


    【解决方案1】:

    我遇到了同样的问题,我为它创建了一个自定义操作。只要您不想计算 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找到的代码

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

    【讨论】:

      【解决方案2】:

      TF 中有very little support for sparse tensors。所以你目前唯一的方法(如你所确定的)是tf.sparse_to_dense()

      【讨论】:

      • 是的,没错。如果我们可以用稀疏张量做更多事情,那就太好了。
      • 肯定会很好,但现在不可能
      猜你喜欢
      • 2011-03-07
      • 2015-02-07
      • 2012-09-04
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多