2017-05-23 8 views
18

बारे tf.contrib.data.Dataset (TensorFlow 1.2 से, देख here और here) उपयोग आम तौर पर डेटा। मेरे मामले में, मेरे पास एक धागा है और मुझे वहां डेटा प्राप्त होता है और जब मैं समाप्त होता हूं तो मुझे पहले से पता नहीं होता है लेकिन मुझे लगता है कि यह कब समाप्त होता है। तब तक मैं इंतजार करता हूं जब तक कि मैंने सभी बफर को संसाधित नहीं किया और फिर मैंने एक युग समाप्त कर दिया। मैं इस तर्क को Dataset के साथ कैसे प्राप्त कर सकता हूं?फ़ीड डेटा

ध्यान दें कि इंटरफ़ेस पर Dataset इंटरफ़ेस को पसंद करता है क्योंकि यह मुझे इटेटर इंटरफ़ेस देता है जिसे मैं पुन: प्रारंभ कर सकता हूं और यहां तक ​​कि Dataset पर रीसेट कर सकता हूं। यह कतारों की तुलना में अधिक शक्तिशाली है जिसे बंद होने के बाद वर्तमान में फिर से खोला नहीं जा सकता है (here और here देखें)।

शायद एक समान प्रश्न, या एक ही प्रश्न: मैं कतार में Dataset के आसपास कैसे लपेट सकता हूं? मेरे पास कुछ धागा है जो कहीं से कुछ डेटा पढ़ता है और जो इसे खिला सकता है और किसी भी तरह से कतार कर सकता है। मैं डेटा को Dataset में कैसे प्राप्त करूं? मैं कुछ डमी टेंसर अनंत समय दोहरा सकता हूं और फिर का उपयोग केवल queue.dequeue() लौटने के लिए कर सकता हूं लेकिन वास्तव में मुझे केवल क्यूई के साथ सभी मूल समस्याओं पर वापस ले जाता है, यानी कतार को फिर से खोलने के लिए कैसे।

+0

क्या आपको ऐसा करने का एक सुविधाजनक तरीका मिला? मुझे वास्तव में एक ही समस्या का सामना करना पड़ रहा है और कच्चे डेटा लोडिंग के बजाय 'डेटासेट' एपीआई का उपयोग करने पर विचार करना शुरू कर रहा हूं (मुझे 'डेटासेट' की पैकेजिंग अधिक सुंदर है)। –

+0

@ विन्स.बीडीएन: नहीं, मुझे कोई प्रतिक्रिया नहीं मिली और मुझे लगता है कि वर्तमान में ऐसा करने का कोई तरीका नहीं है, जब तक कि टीएफ देवता ऐसी कार्यक्षमता को जोड़ न दे। 'डेटासेट 'में अनुपलब्ध कार्यक्षमता के बारे में एक सतत चर्चा [यहां] है (https://github.com/tensorflow/tensorflow/issues/7951), तो शायद वहां टिप्पणी करें और मुझे देखें (@ गब्बर्ट पर गल्बबज़) और यह स्टैक ओवरफ्लो प्रश्न । – Albert

उत्तर

7

नया Dataset.from_generator() विधि आपको एक पायथन जनरेटर द्वारा खिलाया गया Dataset परिभाषित करने की अनुमति देता है। (वर्तमान में इस सुविधा का उपयोग करने के लिए, आपको टेंसरफ्लो का रात्रि निर्माण डाउनलोड करना होगा या इसे स्रोत से स्वयं बनाना होगा। यह टेंसरफ्लो 1.4 का हिस्सा होगा।)

आपके उदाहरण को लागू करने का सबसे आसान तरीका आपके प्राप्त थ्रेड को प्रतिस्थापित करना होगा एक जनरेटर के साथ, स्यूडोकोड साथ इस प्रकार है:

def receiver(): 
    while True: 
    next_element = ... # Receive next element from external source. 
         # Note that this method may block. 

    end_of_epoch = ... # Decide whether or not to stop based on next_element. 

    if not end_of_epoch: 
     yield next_element # Note: you may need to convert this to an array. 
    else: 
     return # Returning will signal OutOfRangeError on downstream iterators. 

dataset = tf.contrib.data.Dataset.from_generator(receiver, output_types=...) 

# You can chain other `Dataset` methods after the generator. For example: 
dataset = dataset.prefetch(...) # This will start a background thread 
           # to prefetch elements from `receiver()`. 

dataset = dataset.repeat(...) # Note that each repetition will call 
           # `receiver()` again, and start from 
           # a fresh state. 

dataset = dataset.batch(...) 

अधिक जटिल टोपोलोजी संभव हो रहे हैं। उदाहरण के लिए, आप समांतर में कई रिसीवर बनाने के लिए Dataset.interleave() का उपयोग कर सकते हैं।

+0

क्या प्रत्येक अपवाद के बीच 'आउटऑफेंजेंजर' फेंकने के साथ, ग्राफ के माध्यम से डेटासेट की फ़ीड दोहराव संभव है? मैंने लिखा [यह उदाहरण] (https://gist.github.com/samwhitlock/93c955b26a329cf2e34c932abff86199) जो 3 बैच आकार के साथ प्रति पुनरावृत्ति के 10 तत्वों को उत्सर्जित करता है, इसलिए "युग" मिश्रित हो जाते हैं (प्रत्येक आउटपुट ट्यूपल्स में पहला पूर्णांक प्रति बैच)। मैं वास्तव में क्या करना चाहता हूं प्रत्येक युग के अंत में एक छोटा बैच उत्सर्जित करता है और फिर अगले पर जाता है (ग्राफ को फिर से शुरू किए बिना?)। क्या यह टेन्सफोर्लो में संभव है? –

+1

@ सैम व्हाइटलॉक मुझे यकीन नहीं है कि यह आपकी समस्या को पूरी तरह से संबोधित करता है, लेकिन - चूंकि आप प्रारंभिक पुनरावर्तक का उपयोग कर रहे हैं - एक संभावना है कि युग में रेंज के लिए 'पायसेट' के साथ 'डेटासेट.रेपीट (3)' को प्रतिस्थापित करें।): 'लूप, जिसके अंदर आप' OutOfRangeError' को पकड़ सकते हैं और प्रारंभकर्ता को फिर से चला सकते हैं। यदि यह काम नहीं करता है, तो एक नया प्रश्न बनाने के लिए स्वतंत्र महसूस करें ताकि हम इसमें विस्तार से जा सकें! – mrry

+0

मैंने प्रारंभकर्ता को पुन: प्रयास करने का प्रयास किया, लेकिन मुझे यह काम नहीं लग रहा है। मैंने यहां इसके लिए एक नया प्रश्न बनाया है https://stackoverflow.com/questions/45956139/resetting-a-tensorflow-graph-after-outofrangeerror-when-using- डेटासेट –

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