2016-08-13 25 views
12

Tôi có một đoạn video của 8000 khung hình, và tôi muốn đào tạo một mô hình Keras trên lô 200 khung hình mỗi. Tôi có một máy phát điện khung mà vòng qua khung frame-by-video và tích lũy (3 x 480 x 640) khung thành một ma trận NumPy X hình dạng (200, 3, 480, 640) - (kích thước hàng loạt, rgb, chiều cao khung hình, độ rộng khung hình) - và sản lượng XY mỗi khung thứ 200:Keras - Các lô và epoch được sử dụng như thế nào trong 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 

Dưới đây là cách chạ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 
     ) 

hiểu biết của tôi là một kết thúc kỷ nguyên khi samples_per_epoch mẫu đã được nhìn thấy bởi các mô hình, và samples_per_epoch = kích thước hàng loạt * số lô = 200 * 40. Vì vậy, sau khi đào tạo cho một kỷ nguyên trên khung 0-7999, kỷ nguyên tiếp theo sẽ bắt đầu đào tạo lại từ khung 0. Điều này có đúng không?

Với thiết lập này Tôi mong đợi 40 lô (mỗi 200 khung hình) được truyền từ máy phát đến fit_generator, mỗi thời gian; đây sẽ là 8000 tổng khung hình mỗi thời đại - ví dụ: samples_per_epoch=8000. Sau đó, cho các kỷ nguyên tiếp theo, fit_generator sẽ khởi tạo lại trình tạo như vậy để chúng tôi bắt đầu đào tạo lại từ đầu video. Đây không phải cuộc điều tra. Sau khi kỷ nguyên đầu tiên hoàn thành (sau khi mô hình ghi lại các lô 0-24), trình tạo sẽ chọn nơi nó đã dừng lại. Chẳng phải kỷ nguyên mới sẽ bắt đầu lại từ đầu tập dữ liệu đào tạo sao?

Nếu có điều gì đó không chính xác trong hiểu biết của tôi về fit_generator vui lòng giải thích. Tôi đã trải qua các tài liệu, example này, và những relatedissues. Tôi đang sử dụng Keras v1.0.7 với phần phụ trợ TensorFlow. Sự cố này cũng được đăng trong số Keras repo.

+0

Là bản sửa lỗi tạm thời, tôi đang lặp lại theo cách thủ công trên các kỷ nguyên và gọi 'model.fit()', như được hiển thị ở đây: https://github.com/fchollet/keras/issues/107 – BoltzmannBrain

Trả lời

8

Sau khi kỷ nguyên đầu tiên là đầy đủ (theo mô hình đăng nhập lô 0-24), các máy phát điện nhặt nơi nó lại tắt

Đây là một mô tả chính xác về những gì xảy ra. Nếu bạn muốn thiết lập lại hoặc tua lại máy phát, bạn sẽ phải làm điều này trong nội bộ. Lưu ý rằng hành vi của keras khá hữu ích trong nhiều trường hợp. Ví dụ, bạn có thể kết thúc một kỷ nguyên sau khi nhìn thấy 1/2 các dữ liệu sau đó làm một kỷ nguyên trên một nửa còn lại, đó sẽ là không thể nếu tình trạng máy phát điện được thiết lập lại (mà có thể hữu ích để theo dõi xác nhận chặt chẽ hơn).

+0

Hmm hữu ích chức năng, cảm ơn bạn đã biết chi tiết. – BoltzmannBrain

5

Bạn có thể buộc máy phát điện của bạn để thiết lập lại bản thân bằng cách thêm một vòng lặp while 1:, đó là cách tôi tiến hành. Do đó, trình tạo của bạn có thể tạo dữ liệu theo đợt cho từng kỷ nguyên.

Các vấn đề liên quan