我有一个8000帧的视频,我想训练一批200帧的Keras模型。我有一个帧生成器,它逐帧循环播放视频并将(3 x 480 x 640)帧累加成X形状的numpy矩阵(200, 3, 480, 640)-(批量大小,rgb,帧高度,帧宽度)-并每200帧产生XY:

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;每个纪元-即samples_per_epoch=8000总共将有8000帧。然后对于随后的时间段,fit_generator将重新初始化生成器,以便我们从视频开始再次开始训练。但是事实并非如此。 在第一个时期完成之后(模型记录批次0-24之后),生成器将在其上次停止的地方继续工作。新纪元不是应该从训练数据集的开头重新开始吗?

如果我对fit_generator的理解不正确,请解释。我已经阅读了文档example和这些related issues。我正在将Keras v1.0.7与TensorFlow后端一起使用。此问题也发布在Keras repo中。

最佳答案



这是对所发生情况的准确描述。如果要重置或倒带发电机,则必须在内部进行。注意,在许多情况下,keras的行为非常有用。例如,您可以在看到数据的1/2之后结束一个时期,然后在另一半上进行一个时期,如果重置了生成器状态,这将是不可能的(这对于更紧密地监视验证很有用)。

关于python - Keras-在fit_generator()中如何使用批次和纪元?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38936016/

10-11 22:14