2016-08-13 2 views
12

У меня есть видео из 8000 кадров, и я хотел бы обучить модель Keras партиями по 200 кадров каждый. У меня есть генератор кадров, который прокручивает кадр за кадром и накапливает (3 x 480 x 640) кадров в матрицу с нулевым размером X формы (200, 3, 480, 640) - (размер партии, rgb, высота кадра, ширина рамки) - и дает X и Y каждый двухсотый кадр:Keras - Как используются партии и эпохи в 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-7999, следующая эпоха начнет тренироваться снова из кадра 0. Правильно ли это?

С этой установкой Я ожидаю, что из генератора будет отправлено 40 партий (из 200 кадров каждый) до fit_generator, за эпоху; это будет 8000 полных кадров за эпоху - то есть, samples_per_epoch=8000. Затем для последующих эпох fit_generator будет повторно инициализировать генератор таким образом, чтобы мы начали тренироваться снова с начала видео. Но это не так. После того, как первая эпоха завершена (после серийных журнальных партий 0-24), генератор поднимается там, где он остановился. Разве новая эпоха не начинается с начала учебного набора данных?

Если в моем понимании fit_generator есть что-то неправильное, пожалуйста, объясните. Я просмотрел документацию, это example, и эти relatedissues. Я использую Keras v1.0.7 с поддержкой TensorFlow. Эта проблема также размещена в Keras repo.

+0

Как временное исправление Я вручную повторяю эпохи и называю 'model.fit()', как показано здесь: https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

ответ

8

После того, как первая эпоха завершения (после того, как модель регистрирует партию 0-24), генератор поднимает, где она была прервана

Это точное описание того, что происходит. Если вы хотите сбросить или перемотать генератор, вам придется сделать это самостоятельно. Обратите внимание, что поведение keras весьма полезно во многих ситуациях. Например, вы можете закончить эпоху после просмотра 1/2 данных, а затем сделать эпоху на другой половине, что было бы невозможно, если бы статус генератора был сброшен (что может быть полезно для более тщательного контроля проверки).

+0

Хм, это полезно функциональность, спасибо за детали. – BoltzmannBrain

5

Вы можете заставить свой генератор сбросить настройки, добавив цикл while 1:, вот как я продолжаю. Таким образом, ваш генератор может получать пакетные данные для каждой эпохи.

Смежные вопросы