Подтвердить что ты не робот

Keras - Как используются партии и эпохи в fit_generator()?

У меня есть видео из 8000 кадров, и я хотел бы обучить модель Keras партиями по 200 кадров каждый. У меня есть генератор кадров, который перебирает кадр за кадром и накапливает (3 x 480 x 640) кадров в матрицу с размером X формы (200, 3, 480, 640) - (размер партии, rgb, высота кадра, кадр width) - и дает X и Y каждый 200-й кадр:

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, и эти связаны issues. Я использую Keras v1.0.7 с поддержкой TensorFlow. Эта проблема также размещена в Keras repo.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Поскольку Генератор является полностью разделенной функцией, он будет продолжать свой бесконечный цикл при каждом повторном вызове.

То, что я не могу оправдать, - то, что fit_generator() будет вызывать генератор, пока у него не будет достаточно выборок. Я не могу найти переменную batch_size, но должен быть критерий, который устанавливает внутреннюю переменную, которая определяет размер.

Я проверил это при печати состояния в каждой последовательности цикла:

def generator():

while 1:
    for i in range(0,len(x_v)-1):
        if (i != predict_batch_nr):
            print("\n -> usting Datasett ", i+1 ," of ", len(x_v))
            x = x_v[i] #x_v has Batches of different length
            y = y_v[i] #y_v has Batches of different length

            yield x, y


model.fit_generator(generator(),steps_per_epoch=5000,epochs=20, verbose=1)

Пример вывода:

4914/5000 [============================>.] - ETA: 13s - loss: 2442.8587
usting Datasett  77  of  92
4915/5000 [============================>.] - ETA: 12s - loss: 2442.3785
-> usting Datasett  78  of  92
-> usting Datasett  79  of  92
-> usting Datasett  80  of  92
4918/5000 [============================>.] - ETA: 12s - loss: 2442.2111
-> usting Datasett  81  of  92
-> usting Datasett  82  of  92