2016-05-02 5 views
13

मैंने एक साधारण जनरेटर बनाया है जो tuple(inputs, targets) को inputs और targets सूचियों में केवल एक आइटम के साथ उत्पन्न करता है - मूल रूप से डेटा सेट को क्रॉल करना, एक समय में एक नमूना आइटम।केरास मॉडल.fit_generator() विधि में, जेनरेटर कतार नियंत्रित पैरामीटर "max_q_size" के लिए उपयोग किया जाता है?

मैं में इस जनरेटर पारित:

  • nb_epoch बार प्रशिक्षण बैच
  • samples_per_epoch चलाया जाएगा की संख्या है के साथ प्रशिक्षित नमूनों की संख्या है:

    model.fit_generator(my_generator(), 
             nb_epoch=10, 
             samples_per_epoch=1, 
             max_q_size=1 # defaults to 10 
            ) 
    

    मुझे लगता है कि मिल प्रति युग

लेकिन 012 क्या हैके लिए और यह 10 के लिए डिफ़ॉल्ट क्यों होगा? मैंने सोचा कि जनरेटर का उपयोग करने का उद्देश्य डेटा सेट को उचित हिस्सों में बैच करना था, तो अतिरिक्त कतार क्यों?

उत्तर

23

यह केवल आंतरिक प्रशिक्षण कतार के अधिकतम आकार को परिभाषित करता है जिसका प्रयोग जनरेटर से आपके नमूने को "सटीक" करने के लिए किया जाता है। यह कतारों की पीढ़ी के दौरान प्रयोग किया जाता है

def generator_queue(generator, max_q_size=10, 
        wait_time=0.05, nb_worker=1): 
    '''Builds a threading queue out of a data generator. 
    Used in `fit_generator`, `evaluate_generator`, `predict_generator`. 
    ''' 
    q = queue.Queue() 
    _stop = threading.Event() 

    def data_generator_task(): 
     while not _stop.is_set(): 
      try: 
       if q.qsize() < max_q_size: 
        try: 
         generator_output = next(generator) 
        except ValueError: 
         continue 
        q.put(generator_output) 
       else: 
        time.sleep(wait_time) 
      except Exception: 
       _stop.set() 
       raise 

    generator_threads = [threading.Thread(target=data_generator_task) 
         for _ in range(nb_worker)] 

    for thread in generator_threads: 
     thread.daemon = True 
     thread.start() 

    return q, _stop 

दूसरे शब्दों में आप जबकि (उदाहरण के लिए) नियमित प्रशिक्षण उसके तत्वों (खपत और कभी कभी, एक धागा कतार अपने जनरेटर से सीधे देखते हुए अधिकतम क्षमता को भरने के लिए है पूरा होने की प्रतीक्षा करता है)

while samples_seen < samples_per_epoch: 
    generator_output = None 
    while not _stop.is_set(): 
     if not data_gen_queue.empty(): 
      generator_output = data_gen_queue.get() 
      break 
     else: 
      time.sleep(wait_time) 

और 10 का डिफ़ॉल्ट क्यों? किसी भी विशेष कारण, जैसे कि अधिकांश डिफ़ॉल्ट - यह केवल समझ में आता है, लेकिन आप विभिन्न मानों का भी उपयोग कर सकते हैं।

इस तरह के निर्माण से पता चलता है कि लेखकों ने महंगी डेटा जेनरेटर के बारे में सोचा था, जिसमें पता लगाने में समय लग सकता है। उदाहरण के लिए जेनरेटर कॉल में किसी नेटवर्क पर डेटा डाउनलोड करने पर विचार करें - फिर कुछ अगले बैचों को सटीक करने के लिए समझदारी होती है, और दक्षता के लिए समानांतर में अगली डाउनलोड करें और नेटवर्क त्रुटियों आदि के लिए मजबूत हो।

+2

आह, मैं देखता हूं, तो आदर्श रूप से आप जनरेटर के परिणाम उत्पन्न करने के लिए इंतजार करने पर प्रशिक्षण कभी नहीं रोकते - आपके पास थ्रेड में चुपचाप कतार भरना होता है जबकि मॉडल पूर्व प्राप्त नमूने पर प्रशिक्षण दे रहा है। – Ray

+1

हां, यह एक आदर्श परिदृश्य है। जो स्पष्ट रूप से कतार और समग्र सिस्टम डिज़ाइन के आकार पर निर्भर करता है। – lejlot

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