2016-08-13 18 views
12

8000 karelik bir videom var ve her biri 200 karelik seriye bir Keras modeli eğitmek istiyorum. Video karesiyle çerçeve içine geçen ve (3 x 480 x 640) kareleri (200, 3, 480, 640)X - (küme boyutu, rgb, çerçeve yüksekliği, çerçeve genişliği) rakamsal matrisine biriktiren bir çerçeve jeneratörü var - ve verimleri X ve Y her 200 kare: * samples_per_epoch numuneler modeli tarafından görülmüş zamanKeras - fit_generator() 'da gruplar ve çağlar nasıl kullanılır?

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

Benim anlayış bir dönem bitirir ve samples_per_epoch = parti boyutu: Burada

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() çalıştırmak nasıl parti sayısı = 200 * 40. Bu nedenle, 0-7999 numaralı karelere bir dönem için eğitim verdikten sonra, bir sonraki dönem çerçeve 0'dan tekrar eğitime başlayacaktır. Bu doğru mu? Bu kurulum ile

beklemek 40 toplu devirde başına fit_generator jeneratörden geçirilecek (200 kare her); Bu, her bir dönem için 812 toplam çerçeve olacaktır ( - yani, samples_per_epoch=8000). Ardından, sonraki dönemler için, fit_generator, jeneratörü yeniden başlatır, böylece videonun başlangıcından itibaren tekrar eğitime başlarız. Ancak durum böyle değil. İlk dönem tamamlandıktan sonra (model kütükleri 0-24'ten sonra), jeneratör kaldığı yerden devam eder. Yeni dönem, eğitim veri kümesinin başlangıcından yeniden başlatılmamalıdır?

fit_generator anlayışımda yanlış bir şey varsa lütfen açıklayın. Dokümantasyondan geçtim, bu example ve bu relatedissues. TensorFlow arka ucunda Keras v1.0.7 kullanıyorum. Bu sorun, ayrıca Keras repo'da da yayınlanmıştır. İlk çağ tamamlandıktan sonra (model toplu 0-24 kaydeder sonra)

+0

Geçici bir düzeltme olarak, el ile çogunlukla çogunlukla yineliyorum ve 'model.fit()' yi çagriyoruz, burada gösterildiği gibi: https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

cevap

8

, jeneratör yap Bu ne doğru bir açıklamasıdır

bıraktığı yerden alır. Jeneratörü sıfırlamak veya geri sarmak isterseniz, bunu dahili olarak yapmanız gerekecektir. Keras'ın davranışının birçok durumda oldukça yararlı olduğunu unutmayın. Örneğin, bir veriyi 1/2 değerini gördükten sonra sonlandırabilir, ardından diğer yarısında bir çığır açabilirsiniz; bu, jeneratör durumu sıfırlandığında (ki bu da doğrulamayı daha yakından izlemek için yararlı olabilir) olanaksız olabilir.

+0

Hmm, bu yararlı bir özelliktir. işlevsellik, ayrıntılar için teşekkür ederim. – BoltzmannBrain

5

Jeneratörünüzü, bir while 1: döngü ekleyerek sıfırlamak için zorlayabilirsiniz, bu şekilde devam ediyorum. Böylece jeneratörünüz her dönem için toplu veri sağlayabilir.

İlgili konular