2016-05-02 3 views
13

inputstargetsのリストには、単一の項目のみを持つtuple(inputs, targets)という単純なジェネレータが構築されました。基本的にデータセットをクロールし、一度に1つのサンプルアイテムをクロールします。Keras model.fit_generator()メソッドでは、ジェネレータキュー制御パラメータ "max_q_size"はどのように使用されますか?

私はにこの発電機を渡す:

  • nb_epochトレーニングバッチが
  • samples_per_epochを実行される回数を用いて訓練サンプル数である:私はことを得る

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

    1エポックあたり

012とは何ですかとその理由は何ですか?私は、ジェネレータを使用する目的はデータセットを妥当な塊にバッチすることだと思ったのですが、なぜ追加のキューが必要ですか?

答えて

23

これは、ジェネレータからのサンプルを「プリキャシュ」するために使用される内部トレーニングキューの最大サイズを単純に定義します。

つまり
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 

(例えば)の訓練ルーチンは時々その要素を消費(としながら、あなたは、あなたの発電機から直接与えられ、最大容量までキューを充填スレッドを持っているキューの生成時に使用されています完了を待つ)

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) 

なぜデフォルトの10?特別な理由はありませんが、デフォルトのほとんどの場合と同様に意味がありますが、異なる値を使用することもできます。

このような構成では、高価なデータジェネレータについて考えていましたが、これは実行に時間がかかる可能性があります。例えば、ジェネレータコールでネットワークを介してデータをダウンロードすることを検討してください。次に効率的にいくつかの次のバッチを事前処理し、効率的にするために並行してダウンロードしてください。

+2

Ah、モデルが以前にフェッチされたサンプルを訓練している間にスレッドを静かにバックで埋めることが理想的です。 – Ray

+1

はい、これは完璧なシナリオです。明らかにキューのサイズとシステム全体の設計に依存します。 – lejlot

関連する問題