2015-12-19 8 views
5

Tensorflow reading data tutorial में एक उदाहरण इनपुट पाइपलाइन दी जाती है। उस पाइपलाइन में डेटा string_input_producer के साथ-साथ shuffle batch generator में दो बार shuffled है।टेन्सफोर्लो ट्यूटोरियल: इनपुट पाइपलाइन में डुप्लिकेट शफलिंग

def input_pipeline(filenames, batch_size, num_epochs=None): 
    # Fist shuffle in the input pipeline 
    filename_queue = tf.train.string_input_producer(
     filenames, num_epochs=num_epochs, shuffle=True) 

    example, label = read_my_file_format(filename_queue) 
    min_after_dequeue = 10000 
    capacity = min_after_dequeue + 3 * batch_size 
    # Second shuffle as part of the batching. 
    # Requiring min_after_dequeue preloaded images 
    example_batch, label_batch = tf.train.shuffle_batch(
     [example, label], batch_size=batch_size, capacity=capacity, 
     min_after_dequeue=min_after_dequeue) 

    return example_batch, label_batch 

दूसरा फेरबदल किसी भी उपयोगी उद्देश्य पूरा करता है: यहाँ कोड है? शफल बैच जनरेटर का नुकसान यह है कि min_after_dequeue उदाहरण हमेशा उपयोगी शफल की अनुमति देने के लिए स्मृति में पूर्व-लोड किए जाते हैं। मेरे पास छवि डेटा है जो स्मृति खपत में काफी भारी है। यही कारण है कि मैं इसके बजाय normal batch generator का उपयोग करने पर विचार कर रहा हूं। क्या डेटा को दो बार घुमाने में कोई फायदा है?

संपादित करें: अतिरिक्त प्रश्न, string_input_producer केवल 32 की डिफ़ॉल्ट क्षमता के साथ क्यों प्रारंभ किया गया है? क्षमता के रूप में बैच_साइज के एकाधिक होने के लिए फायदेमंद नहीं होगा?

उत्तर

6

हां - यह एक आम पैटर्न है, और यह सबसे सामान्य तरीके से दिखाया गया है। string_input_producer उस आदेश को shuffles जिसमें डेटा फ़ाइलों को पढ़ा जाता है। प्रत्येक डेटा फ़ाइल में आमतौर पर दक्षता के लिए कई उदाहरण होते हैं। (दस लाख छोटी फाइलें पढ़ना बहुत धीमा है; 1000 उदाहरणों के साथ 1000 बड़ी फाइलें पढ़ने के लिए बेहतर है।)

इसलिए, फाइलों के उदाहरण एक शफल कतार में पढ़े जाते हैं, जहां वे बहुत अधिक ग्रैन्युलरिटी पर शफल होते हैं , ताकि एक ही फ़ाइल से उदाहरण हमेशा एक ही क्रम में प्रशिक्षित नहीं होते हैं, और इनपुट फ़ाइलों में मिश्रण करने के लिए।

अधिक जानकारी के लिए, Getting good mixing with many input datafiles in tensorflow

अपनी फ़ाइलें प्रत्येक केवल एक ही इनपुट उदाहरण शामिल हैं, तो आप और ध्यान दें कई बार शफ़ल की जरूरत नहीं है केवल एक string_input_producer के साथ भाग मिल सकता है, लेकिन यह है कि आप अभी भी संभावना फ़ायदेमंद साबित होगा एक कतार होने से पढ़ने के बाद कुछ छवियां होती हैं, ताकि आप अपने नेटवर्क के इनपुट और प्रशिक्षण को ओवरलैप कर सकें। queue_runnerbatch या shuffle_batch के लिए एक अलग थ्रेड में चलाया जाएगा, यह सुनिश्चित करने के लिए कि आई/ओ पृष्ठभूमि में हो रहा है और यह छवियां हमेशा प्रशिक्षण के लिए उपलब्ध होती हैं। और, ज़ाहिर है, ट्रेन के लिए मिनीबैच बनाने के लिए गति के लिए यह आमतौर पर अच्छा होता है।

0
शफ़ल की

दोनों विभिन्न प्रयोजनों के कार्य करता है और अलग अलग बातें शफ़ल:

  • tf.train.string_input_producerफेरबदल: बूलियन। यदि सही है, तार प्रत्येक युग के भीतर यादृच्छिक रूप से shuffled हैं।। तो अगर आपके पास कुछ फाइलें हैं ['file1', 'file2', ..., 'filen'] यह यादृच्छिक रूप से इस सूची से एक फ़ाइल का चयन करता है। यदि झूठी बात है, तो फाइलें एक-दूसरे के बाद एक का पालन करती हैं।
  • tf.train.shuffle_batchयादृच्छिक रूप से टेंसर को घुमाकर बैच बनाता है। तो batch_size आपकी कतार read_my_file_format से टेंसर लेता है और उन्हें शफल करता है।

क्योंकि दोनों शफल अलग-अलग चीजें करते हैं, तो डेटा को दो बार घुमाने का लाभ होता है। यहां तक ​​कि यदि आप 256 छवियों के बैच का उपयोग करते हैं, और प्रत्येक छवि 256x256 पिक्सेल है, तो आप 100 एमबी से कम स्मृति का उपभोग करेंगे। अगर किसी बिंदु पर आपको स्मृति समस्याएं दिखाई देगी, तो आप अपने बैच आकार को कम करने का प्रयास कर सकते हैं।

डिफ़ॉल्ट क्षमता के संबंध में - यह model specific है। यह बैच_साइज से बड़ा होना और यह सुनिश्चित करना है कि यह प्रशिक्षण के दौरान कभी खाली नहीं होता है।

0

अतिरिक्त प्रश्न का उत्तर देने के लिए, string_input_producerफाइलों का नाम नामों का एक कतार देता है जिसमें नमूने होते हैं, नमूने स्वयं नहीं। डेटा लोड करने के लिए इस फ़ाइल नाम का उपयोग shuffle_batch द्वारा किया जाता है। लोड किए गए नमूने की संख्या capacityshuffle_batch फ़ंक्शन, string_input_producer पर पैरामीटर से संबंधित है।

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