2016-05-25 31 views
20

यह एक सामान्य प्रश्न है। मैंने पाया कि tensorflow में, हम ग्राफ बनाने के बाद, ग्राफ में डेटा लाते हैं, ग्राफ से आउटपुट एक टेंसर है। लेकिन कई मामलों में, हमें इस आउटपुट के आधार पर कुछ गणना करने की आवश्यकता है (जो tensor है), जिसे टेंसफोर्लो में अनुमति नहीं है।tensorflow में tf.while_loop() का उपयोग कैसे करें

उदाहरण के लिए, मैं एक आरएनएन लागू करने की कोशिश कर रहा हूं, जो डेटा स्वयं संपत्ति के आधार पर समय को लूप करता है। यही है, मुझे यह तय करने के लिए tensor का उपयोग करने की आवश्यकता है कि मुझे रोकना चाहिए (मैं अपने डिजाइन में गतिशील_आरएनएन का उपयोग नहीं कर रहा हूं, आरएनएन अत्यधिक अनुकूलित है)। मुझे लगता है कि tf.while_loop(cond,body.....) मेरे कार्यान्वयन के लिए एक उम्मीदवार हो सकता है। लेकिन आधिकारिक ट्यूटोरियल बहुत आसान है। मुझे नहीं पता कि 'शरीर' में और अधिक कार्यक्षमताओं को कैसे जोड़ा जाए। क्या कोई मुझे कुछ और जटिल उदाहरण दे सकता है?

इसके अलावा, इस तरह के मामले में यदि भविष्य की गणना टेंसर आउटपुट (पूर्व: आउटपुट मानदंड के आधार पर आरएनएन स्टॉप) पर आधारित है, जो बहुत आम मामला है। क्या गतिशील ग्राफ की जगह एक सुरुचिपूर्ण तरीका या बेहतर तरीका है?

उत्तर

29

शरीर में और अधिक कार्यक्षमता जोड़ने से आपको क्या रोक रहा है? आप शरीर में जो भी जटिल कम्प्यूटेशनल ग्राफ पसंद करते हैं उसे बना सकते हैं और संलग्न ग्राफ से आपको जो भी इनपुट पसंद करते हैं उसे ले सकते हैं। इसके अलावा, लूप के बाहर, आप जो भी आउटपुट वापस लौट सकते हैं उसके साथ आप जो भी चाहें कर सकते हैं। जैसा कि आप 'व्हाट्सवर्स' की मात्रा से देख सकते हैं, टेंसरफ्लो के नियंत्रण प्रवाह प्राइमेटिव्स को सामान्यता के साथ बहुत सामान्यता के साथ बनाया गया था। यदि यह मदद करता है तो नीचे एक और 'सरल' उदाहरण है।

import tensorflow as tf 
import numpy as np 

def body(x): 
    a = tf.random_uniform(shape=[2, 2], dtype=tf.int32, maxval=100) 
    b = tf.constant(np.array([[1, 2], [3, 4]]), dtype=tf.int32) 
    c = a + b 
    return tf.nn.relu(x + c) 

def condition(x): 
    return tf.reduce_sum(x) < 100 

x = tf.Variable(tf.constant(0, shape=[2, 2])) 

with tf.Session(): 
    tf.initialize_all_variables().run() 
    result = tf.while_loop(condition, body, [x]) 
    print(result.eval()) 
+0

अच्छी व्याख्या। मेरी समस्या 'शर्त' है जिसे मुझे एक बार 'शरीर' चलाने के बाद गणना की जाती है। तो ऐसा लगता है कि मुझे 'स्थिति' के लिए पैरामीटर के रूप में शरीर के वापसी मूल्य का उपयोग करने की आवश्यकता है। –

+5

आप जो चाहते हैं वह ठीक है जो होता है। लूप 'जबकि (हालत (टेंसर)) {टेंसर = शरीर (टेंसर) है; } ', इसलिए आपके द्वारा पास किए गए टेंसर को हर बार शरीर द्वारा लौटाए गए टेंसर में अपडेट किया जाता है, और फिर उन अद्यतन टेंसर को' स्थिति 'में भेज दिया जाता है। उपरोक्त छद्म कोड लूप के शरीर में प्रवेश करने से पहले, 'बॉडी' पहले * समय से पहले एक ही समय 'शर्त' कहा जाता है। हालांकि, उस स्थिति में, यह केवल 'loop_vars' में आपके द्वारा पारित टेंसर को प्रारंभ करने के बारे में है। उदाहरण के लिए, आप 'body' के परिणाम को' loop_vars' टेंसर के रूप में 'while_loop' पर पास कर सकते हैं। –

+0

ओह, 'loop_vars' के साथ मैं 'while_loop' की फ़ंक्शन परिभाषा का संदर्भ देता हूं, जो' while_loop (हालत, शरीर, loop_vars) 'है (यह टेंसर जो' स्थिति 'और' body' को पास किए जाते हैं) –

संबंधित मुद्दे