2015-11-14 8 views
7

टेंसरफ्लो दस्तावेज़ पढ़ने से मुझे लगता है कि Cholesky decomposition of a square matrix की गणना करने के लिए एक विधि है। हालांकि, आमतौर पर जब मैं Cholesky अपघटन का उपयोग करना चाहता हूं, तो मैं इसे एक रैखिक प्रणाली को हल करने के प्रयोजनों के लिए करता हूं जहां प्रत्यक्ष मैट्रिक्स उलटा अस्थिर हो सकता है।टेंसरफ्लो cholesky decomposition

इसलिए, मैं Scipy में लागू एक के समान विधि की तलाश में हूं। क्या किसी को पता है कि यह टेंसरफ्लो में मौजूद है या यदि कोई तरीका है तो इसे शामिल किया जा सकता है?

+0

सिसि में लागू किए गए किसी के साथ क्या गलत है? वैसे भी, आप सरल प्रतिस्थापन का उपयोग कर अपना स्वयं का कार्यान्वयन कर सकते हैं (https://en.wikipedia.org/wiki/Triangular_matrix#Forward_and_back_substitution देखें) – Berci

+1

मेरी इंप्रेशन यह है कि यदि मैं एक टेंसरफ्लो सत्र निष्पादित करता हूं तो एक हाथी सरणी प्राप्त करने के लिए scipy मैं समय-समय पर कम्प्यूटेशनल ग्राफ को समाप्त कर दूंगा जो टेंसरफ्लो बनाता है (क्योंकि रैखिक प्रणाली को हल करना मेरे उद्देश्यों के लिए रेखा का अंत नहीं है)। अनुमोदित, मैंने यह कोशिश नहीं की है, लेकिन थानो इस तरह से काम करेगा और मुझे लगता है कि यह टेंसरफ्लो तक भी बढ़ेगा। एक अंतर्निहित समाधान उभरने तक मैं अपना खुद का रोल करूंगा। – user1936768

उत्तर

3

उपयोगकर्ता 1 9 .8: यदि आप टेंस्फोर्लो में चीजें "ज्यादातर" रखना चाहते हैं तो ऐसा करने का तरीका यह होगा कि आप और बर्सी टिप्पणियों पर चर्चा कर रहे थे: उस बिंदु तक tensorflow ग्राफ को चलाएं जहां तक ​​आप रैखिक प्रणाली को हल करने की आवश्यकता है, और फिर फ़ीड_डिक्ट के साथ परिणामों को वापस फ़ीड करें। स्यूडोकोड में:

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 में अपने मध्यवर्ती परिणाम stashing है, ताकि आप गणना बाद में फिर से शुरू कर सकते हैं।

(मैं यह वादा नहीं कर रहा हूं कि आप tf.cholesky से बाहर निकलने के लिए सही तरीके से फ़ीड करने के लिए सही प्रारूप में हैं, या आपको केवल पहले चरण में मैट्रिक्स को खींचना नहीं चाहिए और इसे ठीक करने के लिए फ़ीड नहीं करना चाहिए , लेकिन यह समग्र वर्कफ़्लो आपके लिए काम करना चाहिए)।

ध्यान दें कि यदि आप भारी मल्टीकोर या जीपीयू ऑपरेशंस कर रहे हैं तो यह एक प्रदर्शन बाधा उत्पन्न करेगा और फिर मैट्रिक्स को थप्पड़ मारने पर क्रमबद्ध करना होगा, लेकिन यह भी ठीक हो सकता है - आपकी सेटिंग पर बहुत निर्भर करता है।

+0

आइए कहें कि मैं चॉल्स्की अपघटन के बजाय एक अलग-अलग फ़ंक्शन का उपयोग कर रहा था (मुझे यकीन नहीं है कि सीडी के माध्यम से अंतर करना संभव है; यह हो सकता है: [यहां] (http://deeplearning.net/software/theano/library/tensor /slinalg.html#theano.tensor.slinalg.CholeskyGrad))। तो क्या कम्प्यूटेशनल ग्राफ से बाहर निकलने की आपकी सिफारिश होगी और फिर बाद के चरण सीमा में फिर से प्रवेश करें TensorFlow की सभी गणितीय परिचालनों के माध्यम से बैकप्रोपैगेट करने की क्षमता? ऐसा लगता है कि यह ... – user1936768

+0

सही - टीएफ फ़ीड_डिक्ट के माध्यम से बैकप्रॉप नहीं कर सकता है। क्या आपको ऐसा करने की ज़रूरत है, या यह जिज्ञासा से बाहर है?:) (टेन्स्फोर्लो के चॉल्सकी में ढाल वाला फ़ंक्शन नहीं है, इसलिए बेस केस संस्करण काम नहीं करेगा।) – dga

+0

मुझे सीडी के माध्यम से बैकप्रॉप करने की आवश्यकता नहीं है, लेकिन मुझे मैट्रिक्स निर्धारक के माध्यम से बैकप्रॉप करने की आवश्यकता है। मैं यह देखने के लिए निराश था कि टेंसरफ्लो के मैट्रिक्स निर्धारक में अंतर्निहित पंजीकृत ढाल भी नहीं है। क्या आपको पता है कि टेंसरफ्लो में '@ tf.RegisterGradient' सजावट का उपयोग करके जैकोबी के सूत्र को कार्यान्वित करने का कोई आसान तरीका है? – user1936768

3

अद्यतन (2017/04/23)

TensorFlow अब कई linear algebra operations है। उदाहरण के लिए, चेकआउट tf.cholesky_solve, tf.matrix_solve_ls, tf.matrix_solve, tf.qr, tf.svd आदि। बेशक, नीचे मूल उत्तर भी सहायक हो सकता है।

मूल क्या matrix_inverse आपको क्या चाहिए? यह इनपुट के आधार पर Cholesky या LU Decomposition का उपयोग करता है। उदाहरण के लिए,

>>> 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.]] 
संबंधित मुद्दे