2017-07-12 61 views
1

Tensorflowに疎な三角行列を使ってAx = bを解く実装がありましたか?Tensorflowのスパース行列三角解法?

AFAIKたとえば、Aを疎行列表現の下三角行列として使用する場合は、tf.sparse_to_dense()を使用して密行列に変換する必要があります。 )。

しかし、Aが非常に大きな次元、たとえば16416x16416を持ち、非常にまばらなエントリ、たとえば0.018%(約45216の非ゼロ)の場合、大量のメモリが必要になります。

私たちはTensorflowでは、このようなバンド構造を持つ行列のためとして、疎行列ソルバを利用することができれば、それは非常に参考になると思います。

申し訳ありませんが、私の質問が関連していない場合。 たとえば、これに対する解決策があれば、私は何か助けに感謝します。

ありがとうございました。

答えて

0

TFでvery little support for sparse tensorsがあります。だからあなたの唯一の方法は、現在、(あなたが特定したとして)私は同じ問題を抱えていたと私はそれのためのカスタムオペアンプを作成tf.sparse_to_dense()

+0

あなたが(例えば、勾配の計算で)エラーを見つけた場合、私に教えてください。 疎なテンソルでもっとやることができれば非常にいいです。 –

+0

間違いなくいいですが、今はできません –

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

で発見しました、ソリューションは非常に高速です。真、そう

関連する問題