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