2015-11-14 13 views
7

TensorFlowのドキュメントを読むと、Cholesky decomposition of a square matrixを計算する方法があることがわかります。しかし、通常、コレスキー分解を使用する場合は、直接行列反転が不安定になる線形システムを解く目的で行います。TensorFlowコレスキー分解

したがって、私はScipyに実装されているのと同様の方法を探しています。これがTensorFlowに存在するかどうか、またはそれが組み込まれる方法があるかどうかは誰にも分かりますか?

+0

Scipyで実装されているものは何ですか?とにかく、単純な置換を使って独自に実装することができます(https://en.wikipedia.org/wiki/Triangular_matrix#Forward_and_back_substitutionを参照してください) – Berci

+1

私がTensorFlowセッションを実行してnumpy配列を取得してからscipy TensorFlowが構築する計算グラフを早期に終了させます(線形システムの解法は私の目的のための線の終わりではないからです)。確かに、私はこれを試していないが、Theanoはこのように動作し、TensorFlowにも及ぶだろうと想像している。組み込みのソリューションが出現するまで私は自分自身をロールバックします。 – user1936768

答えて

3

user19..8:テンソルフローで物事を「ほとんど」維持したい場合は、あなたとBerciがコメントで議論していたことを実行することです:テンソルフローグラフを実行して線形システムを解き、結果を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に吐き出してシリアル化する必要がある場合は、パフォーマンスのボトルネックが発生することに注意してください。

+0

私はCholesky分解の代わりに微分可能な関数を使用していたと言います(CDで区別することができるかどうかはわかりませんが、次のようになります:[here](http://deeplearning.net/software/theano/library/tensor /slinalg.html#theano.tensor.slinalg.CholeskyGrad))。その後、計算グラフから抜け出し、後の段階で再入力することで、TensorFlowのすべての数学演算をバックプロパゲーションする能力を制限することをお勧めしますか? ... – user1936768

+0

修正 - TFはfeed_dictを逆行できません。あなたはそうする必要がありますか、これは好奇心からですか?:)(TensorflowのCholeskyにはグラデーション関数がないので、ベースケースのバージョンは動作しません) – dga

+0

私はCDをバックプロップする必要はありませんが、行列式を逆投影する必要があります。私は、TensorFlowの行列式も組み込みの勾配を持たないことに驚いていました。 TensorFlowの '@ tf.RegisterGradient'デコレータを使ってJacobiの式を実装する簡単な方法があるかどうか知っていますか? – user1936768

3

アップデート(2017年4月23日)

TensorFlowは今linear algebra operations多くを持っています。例えば、チェックアウトtf.cholesky_solve,、tf.matrix_solvetf.qrtf.svdなどです。もちろん、以下の元の回答も参考になる場合があります。

オリジナル matrix_inverseが必要ですか?入力に応じて、コレスキーまたは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.]] 
関連する問題