2016-05-02 14 views
13

Tôi đã tạo một trình tạo đơn giản để tạo ra một tuple(inputs, targets) chỉ với một mục duy nhất trong danh sách inputstargets - về cơ bản thu thập dữ liệu tập hợp, một mục mẫu tại một thời điểm.Trong phương thức mô hình Keras.fit_generator(), tham số kiểm soát hàng đợi máy phát điện "max_q_size" được sử dụng để làm gì?

tôi vượt qua máy phát điện này thành:

model.fit_generator(my_generator(), 
         nb_epoch=10, 
         samples_per_epoch=1, 
         max_q_size=1 # defaults to 10 
        ) 

Tôi nhận được rằng:

  • nb_epoch là số lần so với đợt tập huấn sẽ được chạy
  • samples_per_epoch được số lượng mẫu được đào tạo với mỗi epoch

Nhưng 012 là gìcho và tại sao nó sẽ mặc định là 10? Tôi nghĩ rằng mục đích của việc sử dụng một máy phát điện là để tập dữ liệu hàng loạt thành các phần hợp lý, vậy tại sao hàng đợi bổ sung?

Trả lời

23

Điều này chỉ xác định kích thước tối đa của hàng đợi đào tạo nội bộ được sử dụng để "precache" mẫu của bạn từ trình tạo. Nó được sử dụng trong thế hệ của các hàng đợi

def generator_queue(generator, max_q_size=10, 
        wait_time=0.05, nb_worker=1): 
    '''Builds a threading queue out of a data generator. 
    Used in `fit_generator`, `evaluate_generator`, `predict_generator`. 
    ''' 
    q = queue.Queue() 
    _stop = threading.Event() 

    def data_generator_task(): 
     while not _stop.is_set(): 
      try: 
       if q.qsize() < max_q_size: 
        try: 
         generator_output = next(generator) 
        except ValueError: 
         continue 
        q.put(generator_output) 
       else: 
        time.sleep(wait_time) 
      except Exception: 
       _stop.set() 
       raise 

    generator_threads = [threading.Thread(target=data_generator_task) 
         for _ in range(nb_worker)] 

    for thread in generator_threads: 
     thread.daemon = True 
     thread.start() 

    return q, _stop 

Nói cách khác bạn có một chủ đề đầy hàng đợi lên đến nhất định, công suất tối đa trực tiếp từ máy phát điện của bạn, trong khi (ví dụ) thường xuyên đào tạo tiêu thụ yếu tố của nó (và đôi khi chờ hoàn thành)

while samples_seen < samples_per_epoch: 
    generator_output = None 
    while not _stop.is_set(): 
     if not data_gen_queue.empty(): 
      generator_output = data_gen_queue.get() 
      break 
     else: 
      time.sleep(wait_time) 

và tại sao mặc định là 10? Không có lý do cụ thể, giống như hầu hết các mặc định - nó chỉ đơn giản là có ý nghĩa, nhưng bạn cũng có thể sử dụng các giá trị khác nhau.

Xây dựng như thế này cho thấy, tác giả nghĩ về máy phát dữ liệu đắt tiền, có thể mất thời gian để cắt. Ví dụ: xem xét tải xuống dữ liệu qua mạng trong cuộc gọi của trình tạo - sau đó tải xuống trước một số đợt tiếp theo và tải xuống các phần tiếp theo song song vì mục đích hiệu quả và mạnh mẽ đối với lỗi mạng, v.v.

+2

Ah, tôi hiểu, vì vậy lý tưởng bạn không bao giờ ngừng đào tạo trên chờ đợi cho máy phát điện để tạo ra kết quả - bạn có một chủ đề điền vào hàng đợi lên âm thầm ở phía sau trong khi mô hình được đào tạo trên các mẫu lấy trước. – Ray

+1

Vâng, đây là một kịch bản hoàn hảo. Mà rõ ràng phụ thuộc vào kích thước của hàng đợi và thiết kế hệ thống tổng thể. – lejlot

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