です。限り、あなたは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
で発見しました、ソリューションは非常に高速です。真、そう
あなたが(例えば、勾配の計算で)エラーを見つけた場合、私に教えてください。 疎なテンソルでもっとやることができれば非常にいいです。 –
間違いなくいいですが、今はできません –