Keras -在fit_generator()中如何使用批处理和epoch



我有一个8000帧的视频,我想训练一个Keras模型,每个批次200帧。我有一个帧生成器,通过视频逐帧循环并将(3 x 480 x 640)帧累积到形状为(200, 3, 480, 640)的numpy矩阵X中-(批量大小,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样本被模型看到时,一个epoch结束,samples_per_epoch = batch size * batch number = 200 * 40。因此,在0-7999帧上训练一个epoch后,下一个epoch将从0帧开始再次训练。这是正确的吗?

使用此设置,我希望每个epoch将40批(每个200帧)从生成器传递到fit_generator;这将是每个epoch(即samples_per_epoch=8000)总共8000帧。然后对于随后的epoch, fit_generator将重新初始化生成器,以便我们从视频开始再次开始训练。然而,事实并非如此。在第一个epoch完成后(在模型记录批次0-24之后),生成器从它停止的地方开始。新的纪元不应该从训练数据集的开始重新开始吗?

如果我对fit_generator的理解有误,请解释。我已经通读了文档、这个示例以及这些相关问题。我使用Keras v1.0.7与TensorFlow后端。此问题也发布在Keras repo中。

在第一个epoch完成后(在模型记录批次0-24之后),生成器从它停止的位置拾取

这是对所发生事情的准确描述。如果你想重置或倒带发电机,你必须在内部这样做。请注意,keras的行为在许多情况下都非常有用。例如,您可以在看到1/2的数据后结束epoch,然后在另一半数据上执行epoch,如果生成器状态被重置(这对于更密切地监视验证很有用),则不可能这样做。

您可以通过添加while 1:循环来强制生成器重置自己,这就是我如何进行的。因此,您的生成器可以为每个epoch生成批处理数据。

由于Generator是一个完全分离的函数,因此无论何时再次调用它,它都将继续进行无限循环。

我不能证明的是,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

相关内容

  • 没有找到相关文章

最新更新