私は8000フレームのビデオを持っており、それぞれ200フレームのバッチでKerasモデルを訓練したいと思います。私はフレームごとにビデオをループし、(3 x 480 x 640)フレームをnumpy行列に蓄積するフレームジェネレータを持っていますX
形の(200, 3, 480, 640)
- (バッチサイズ、rgb、フレームの高さ、フレーム幅) - そして利回りX
とY
すべての生誕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をログに記録した後)
一時的な修正として、私は手動でエポックを繰り返し、 'model.fit()'を以下のように呼び出します:https://github.com/fchollet/keras/issues/107 – BoltzmannBrain