2016-08-13 11 views
12

私は8000フレームのビデオを持っており、それぞれ200フレームのバッチでKerasモデルを訓練したいと思います。私はフレームごとにビデオをループし、(3 x 480 x 640)フレームをnumpy行列に蓄積するフレームジェネレータを持っていますX形の(200, 3, 480, 640) - (バッチサイズ、rgb、フレームの高さ、フレーム幅) - そして利回りXYすべての生誕200フレーム: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から再び訓練を開始します。これは正しいですか?

エポックごとにジェネレータからfit_generatorに40バッチ(それぞれ200フレーム)が渡されます。これは、1エポック当たり8000総フレーム、つまりsamples_per_epoch=8000となります。その後のエポックでは、fit_generatorはジェネレータを再初期化し、ビデオの先頭からトレーニングを再開します。しかしこれはそうではありません。 最初のエポックが完了した後(モデルロットのバッチ0〜24のログが記録された後)、ジェネレータは中断した箇所をピックアップします。新しいエポックはトレーニングデータセットの最初からやり直すべきではありませんか?

fit_generatorの私の理解に間違いがある場合は、説明してください。私はこのドキュメントexampleとこれらのrelatedissuesを見てきました。私はTensorFlowバックエンドでKeras v1.0.7を使用しています。この問題はKeras repoにも掲載されています。最初のエポックが完了した後(モデルバッチ0-24をログに記録した後)

+0

一時的な修正として、私は手動でエポックを繰り返し、 'model.fit()'を以下のように呼び出します:https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

答えて

8

は、発電機は、これは何が起こるかの正確な説明である

を中断したところピックアップ。ジェネレータをリセットまたは巻き戻したい場合は、これを内部的に行う必要があります。ケラの動作は多くの状況で非常に有用であることに注意してください。たとえば、データの1/2を見た後にエポックを終了し、残りの半分でエポックを実行すると、ジェネレータのステータスがリセットされていると不可能になります(検証をより詳細に監視するのに便利です)。

+0

これは便利です機能性、詳細はおねがいします。 – BoltzmannBrain

5

while 1:ループを追加することで、発電機を強制的にリセットすることができます。これは私の進め方です。したがって、あなたのジェネレータは各エポック毎にバッチデータを得ることができます。

関連する問題