6

पृष्ठभूमिथ्रेडिंग tensorflow के इनपुट पाइप लाइन में

tensorflow में ठेठ इनपुट पाइप लाइन इस प्रकार की तरह दिखता है:

    tf.train.string_input_producer(list_of_filenames) 
         (creates queue of filenames) 
            | 
            \|/ 
      fixed length reader reads records from the files 
            | 
            \|/ 
    Read records are decoded and processed(eg if dealing with images then cropping,flipping etc) 
            | 
            \|/ 
      tf.train.shuffle_batch(tensors,num_threads) 
     (creates a shuffling queue and returns batches of tensors) 

समस्या

क्यू 1) वहाँ समारोह tf में NUM_THREADS का कोई तर्क है .train.string_input_producer()। क्या इसका मतलब यह है कि केवल एक धागा फ़ाइल नाम कतार से फ़ाइल नाम पढ़ने के लिए समर्पित है?

प्रश्न 2) tf.train.shuffle_batch() यानी फ़ंक्शन के num_threads तर्क का दायरा क्या है, यानी यहां वर्णित धागे की संख्या का उपयोग फ़ाइलों को पढ़ने, डीकोड करने और संसाधित करने के लिए भी किया जाता है या वे बैच बनाने के लिए उपयोग किए जाते हैं टेंसर के?

क्यू 3) क्या प्रिंट करने का कोई तरीका है कि कौन सा थ्रेड किसी विशेष फ़ाइल से फ़ाइल नाम या रिकॉर्ड पढ़ता है यानी प्रत्येक धागे द्वारा किए गए कार्यों का रिकॉर्ड?

+1

में जोड़ने से बचें होगा एसओ पर एक बार में कई प्रश्न पूछना। एक में कई प्रश्न पूछना, ठीक है, सवाल क्यू/ए प्रारूप के साथ काम नहीं करता है SO का उपयोग कर रहा है और उन लोगों को दूर कर सकता है जो केवल एक प्रश्न का उत्तर दे सकते हैं। – etarion

+0

@etarion वे कई प्रश्न देख सकते हैं लेकिन वे अत्यधिक सहसंबंधित हैं। वे tensorflow की इनपुट पाइपलाइन के सभी हिस्सों हैं। अगर उनमें से किसी एक का जवाब देने में सक्षम कोई भी निश्चित रूप से सभी प्रयासों का उत्तर देने में सक्षम होगा। मैं बस यह सुनिश्चित करना चाहता था उत्तरों के बारे में। –

+0

"यदि उनमें से किसी एक का जवाब देने में सक्षम कोई भी निश्चित रूप से सभी प्रयासों का उत्तर देने में सक्षम होगा।" कोई भी कथन बनाने के लिए योग्य कोई भी प्रश्नों का उत्तर देने में सक्षम होगा, इसलिए यदि आप वह कथन कर सकते हैं, तो आप अपने प्रश्न का उत्तर क्यों नहीं देते? – etarion

उत्तर

4

आपके सभी डेटा लोडिंग ऑपरेशंस tensorflow ग्राफ के भीतर किए जाते हैं, आप जो करना चाहते हैं वह पाठक/एनक्यूयू ऑपरेशंस पर फिर से शुरू करने के लिए एक या अधिक धागे लॉन्च करना है। Tensorflow एक QueueRunner कक्षा प्रदान करता है जो वास्तव में करता है। समन्वयक वर्ग आपको धागे को बहुत ही कम प्रबंधित करने की अनुमति देता है।

https://www.tensorflow.org/programmers_guide/threading_and_queues

यह ऊपर के लिंक से उदाहरण कोड है:

# Create a queue runner that will run 4 threads in parallel to enqueue 
# examples. 
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4) 

# Launch the graph. 
sess = tf.Session() 
# Create a coordinator, launch the queue runner threads. 
coord = tf.train.Coordinator() 
enqueue_threads = qr.create_threads(sess, coord=coord, start=True) 
# Run the training loop, controlling termination with the coordinator. 
for step in xrange(1000000): 
    if coord.should_stop(): 
     break 
    sess.run(train_op) 
# When done, ask the threads to stop. 
coord.request_stop() 
# And wait for them to actually do it. 
coord.join(enqueue_threads) 

यदि आप लोड हो रहा है कर रहे थे/ग्राफ के बाहर नमूने preprocessing (अपने खुद के कोड में, TF संचालन का उपयोग नहीं), तो आप QueueRunner का उपयोग नहीं करेंगे, इसके बजाय आप एक लूप में sess.run(enqueue_op, feed_dict={...}) कमांड का उपयोग करके डेटा को एनक्यू करने के लिए अपनी कक्षा का उपयोग करेंगे।

Q1: qr.create_threads(sess, coord=coord, start=True)

Q2:: थ्रेड की संख्या के साथ नियंत्रित किया जाता है TF सत्र धागा सुरक्षित हैं, tf.run(...) की प्रत्येक कॉल की, जब यह शुरू के रूप में वर्तमान चर का एक सुसंगत स्नैपशॉट देखता है। आपके QueueRunner enqueue ops किसी भी संख्या में धागे चला सकते हैं। वे थ्रेड-सुरक्षित तरीके से कतारबद्ध होंगे।

Q3: मैं अपने आप को tf.train.string_input_producer उपयोग नहीं किया है, लेकिन मुझे लगता है कि आप ग्राफ में बाद में एक टेन्सर अनुरोध करने के लिए कि dequeued डेटा, सिर्फ इतना है कि टेन्सर अनुरोधों की अपनी सूची में sess.run([train_op, dequeue_op])

+0

उत्तर के लिए धन्यवाद! मैं सिर्फ दूसरे प्रश्न के कुछ पहलुओं को साफ़ करना चाहता हूं। ऊपर दिए गए एनक्यूयू सेशन में कुछ इन-हाउस टेंसरफ़्लो फ़ंक्शंस (निश्चित लम्बाई पाठक और क्रॉपिंग, एनक्यूइंग से पहले फ़्लिपिंग) के माध्यम से डेटा के कुछ पढ़ने और प्रीप्रोकैसिंग का पालन किया जाता है। समानांतर में चलने वाले 4 धागे, क्या वे डेटा को एनक्यूइंग करने या + प्रीप्रोकैसिंग + एनक्यूइंग पढ़ने के लिए जिम्मेदार होंगे? –

+1

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

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