2016-08-13 8 views
12

मेरे पास 8000 फ्रेम का वीडियो है, और मैं प्रत्येक 200 फ्रेम के बैचों पर एक केरा मॉडल को प्रशिक्षित करना चाहता हूं। मेरे पास एक फ्रेम जनरेटर है जो वीडियो फ्रेम-दर-फ्रेम के माध्यम से loops और आकार (200, 3, 480, 640) आकार (0 बैच आकार, आरजीबी, फ्रेम ऊंचाई, फ्रेम चौड़ाई) के एक numpy मैट्रिक्स X में (3 x 480 x 640) फ्रेम जमा करता है - और पैदावार X और Y हर 200 वीं फ्रेम:केरास - fit_generator() में बैचों और युग का उपयोग कैसे किया जाता है?

import cv2 
... 
def _frameGenerator(videoPath, dataPath, batchSize): 
    """ 
    Yield X and Y data when the batch is filled. 
    """ 
    camera = cv2.VideoCapture(videoPath) 
    width = camera.get(3) 
    height = camera.get(4) 
    frameCount = int(camera.get(7)) # Number of frames in the video file. 

    truthData = _prepData(dataPath, frameCount) 

    X = np.zeros((batchSize, 3, height, width)) 
    Y = np.zeros((batchSize, 1)) 

    batch = 0 
    for frameIdx, truth in enumerate(truthData): 
     ret, frame = camera.read() 
     if ret is False: continue 

     batchIndex = frameIdx%batchSize 

     X[batchIndex] = frame 
     Y[batchIndex] = truth 

     if batchIndex == 0 and frameIdx != 0: 
      batch += 1 
      print "now yielding batch", batch 
      yield X, Y 

यहाँ है कैसे fit_generator() चलाएँ:

 batchSize = 200 
     print "Starting training..." 
     model.fit_generator(
      _frameGenerator(videoPath, dataPath, batchSize), 
      samples_per_epoch=8000, 
      nb_epoch=10, 
      verbose=args.verbosity 
     ) 

मेरे समझ एक युग खत्म जब samples_per_epoch नमूने मॉडल के आधार पर देखा गया है है, और samples_per_epoch = बैच का आकार * बैचों की संख्या = 200 * 40। तो फ्रेम 0-79 99 पर एक युग के लिए प्रशिक्षण के बाद, अगला युग फ्रेम 0 से फिर से प्रशिक्षण शुरू कर देगा। क्या यह सही है?

इस सेटअप के साथ मुझे जनरेटर से 40 बैचों (200 फ्रेम प्रत्येक) को fit_generator पर प्रति युग की उम्मीद है; यह 8000 कुल फ्रेम प्रति युग होगा - यानी samples_per_epoch=8000। फिर बाद के युगों के लिए, fit_generator जेनरेटर को फिर से शुरू करेगा जैसे कि हम वीडियो की शुरुआत से फिर से प्रशिक्षण शुरू करते हैं। फिर भी यह मामला नहीं है। पहला युग पूरा होने के बाद (मॉडल लॉग 0-24 बैचों के बाद), जेनरेटर जहां इसे छोड़ दिया जाता है वहां उठाता है। क्या नया युग प्रशिक्षण डेटासेट की शुरुआत से फिर से शुरू नहीं होना चाहिए?

यदि fit_generator की मेरी समझ में कुछ गड़बड़ है तो कृपया समझाएं। मैं प्रलेखन के माध्यम से चला गया है, यह example, और ये relatedissues। मैं टेन्सोरफ्लो बैकएंड के साथ केरास v1.0.7 का उपयोग कर रहा हूं। यह समस्या Keras repo में भी पोस्ट की गई है।

+0

एक अस्थायी फिक्स के रूप में मैं मैन्युअल रूप से युगों पर पुन: प्रयास कर रहा हूं और 'model.fit()' को कॉल कर रहा हूं, जैसा कि यहां दिखाया गया है: https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

उत्तर

8

पहले युग के पूर्ण होने पर (के बाद मॉडल बैचों 0-24 लॉग), जनरेटर ऊपर उठाता है जहां यह

दूर छोड़ दिया यही होता है की एक सटीक वर्णन है। अगर आप जनरेटर को रीसेट या रिवाइंड करना चाहते हैं, तो आपको इसे आंतरिक रूप से करना होगा। ध्यान दें कि कई स्थितियों में कैरस का व्यवहार काफी उपयोगी है। उदाहरण के लिए, आप 1/2 डेटा को देखने के बाद एक युग समाप्त कर सकते हैं, फिर दूसरे आधा पर एक युग करते हैं, जो जेनरेटर स्थिति रीसेट हो जाने पर असंभव होगा (जो सत्यापन को अधिक बारीकी से निगरानी के लिए उपयोगी हो सकता है)।

+0

हम्म यह उपयोगी है कार्यक्षमता, विवरण के लिए धन्यवाद। – BoltzmannBrain

5

आप अपने जनरेटर को while 1: लूप जोड़ कर खुद को रीसेट करने के लिए मजबूर कर सकते हैं, इस तरह मैं आगे बढ़ता हूं। इस प्रकार आपका जनरेटर प्रत्येक युग के लिए बैच किए गए डेटा उत्पन्न कर सकता है।

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