2016-08-13 7 views
12

나는 8000 프레임의 비디오를 가지고 있으며, 각각 200 프레임의 배치로 Keras 모델을 훈련하고 싶습니다. 프레임마다 비디오를 순환하고 (3x480x640) 프레임을 누적 행렬 X (누적 크기, rgb, 프레임 높이, 프레임 너비) 모양 으로 축적하는 프레임 생성기가 있습니다. 수율은 XY 모든 200 프레임 : * samples_per_epoch 샘플 모델 볼되었을 때Keras - 배치 및 신기원은 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 = 배치 크기 : 여기

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()을 실행 어떻게 배치 수 = 200 * 40. 따라서 0-7999 프레임의 에포크를 훈련 한 후에 다음 에포크는 0 프레임에서 다시 훈련을 시작합니다. 맞습니까?

발전기에서 40 획 (각 200 프레임)이 신기원 당 fit_generator이 될 것으로 예상합니다. 이것은 신기원 당 총 8000 개의 총 프레임 수 - 즉, samples_per_epoch=8000입니다. 이어지는 신기원을 위해 fit_generator은 발전기를 다시 초기화하여 비디오의 처음부터 다시 훈련을 시작합니다. 그러나 이것은 사실이 아닙니다. 첫 번째 신기원이 완료되면 (모델 로그 배치 0-24가 기록 된 후), 생성기는 중단 된 부분을 선택합니다. 새로운 신기원을 훈련 데이터 세트의 처음부터 다시 시작하면 안됩니까?

제발 이해가 안되는 부분이 있으시면 fit_generator 설명해주십시오. 나는 설명서를 읽었으며,이 example과이 relatedissues입니다. 나는 Kerano v1.0.7을 TensorFlow 백엔드와 함께 사용하고 있습니다. 이 문제는 Keras repo에도 게시됩니다. 첫 번째 시대가 완료되면 (모델이 배치 0-24를 기록 후)

+0

일시적인 수정으로 저는 수동으로 에포크를 반복하고 다음과 같이'model.fit()'를 호출합니다 : https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

답변

8

은 발전기는이 일이 무엇인지에 대한 정확한 설명입니다

을 중단 한 부분 선택합니다. 발전기를 리셋하거나 되감 으려면 내부적으로이 작업을 수행해야합니다. 케라의 행동은 많은 경우에 매우 유용합니다. 예를 들어, 데이터의 1/2을 본 후 에포크를 끝낸 다음 다른 반쪽에서 에포크를 마친 후에는 에포크를 종료 할 수 있습니다. 이는 생성기 상태가 재설정 된 경우 불가능합니다 (유효성 검사를보다 면밀하게 모니터링하는 데 유용 할 수 있음).

+0

흠 그게 유용합니다. 기능성, 세부 사항에 대해 감사드립니다. – BoltzmannBrain

5

while 1: 루프를 추가하여 발전기가 강제로 리셋되도록 할 수 있습니다. 이것이 내가 진행하는 방법입니다. 따라서 생성기는 각 신기원에 대해 일괄 처리 된 데이터를 생성 할 수 있습니다.

관련 문제