2016-07-06 2 views
0

私はテンソルフローで非常に遅いバッチロードに問題があります。 トレーニングの各ステップはかなり速いですが、データを読み込む機能は非常に遅いです。テンソルフローのバッチのロードを最適化するにはどうすればよいですか?

列車操作が実行されているときに、この手順をバックグラウンドで実行する方法があるかどうか疑問に思っていたので、1つの手順が完了するまでにバッチを準備できるようになりました。

私の機能はnumpy配列で保存されています。

すべてのアイデア? これは私のコードです。

def test_loadbatch(no_timesteps,list_of_file_paths,batch_size): 
    nof=no_timesteps# No of combined 
    files=list_of_file_paths 
    files=shuffle_list(files) 
    classes=get_class_number(files) 
    temp_batch=np.zeros(shape=(batch_size,no_timesteps,4096),dtype=np.float32) 
    temp_classes=np.zeros(shape=(batch_size,101),dtype=np.float32) 
    bat_num=0 
    fileno=0 
    while bat_num != batch_size : 
     if os.path.isfile(str(files[fileno])): 
      val=np.load(str(files[fileno])) 
      try: 
       if val.shape[0]>no_timesteps+2: 
        num=random.randint(0,val.shape[0]-(no_timesteps+2)) 
        temp_batch[bat_num,:,:]=val[num:num+nof,:] 
        temp_classes[bat_num,:]=create_one_hot(classes[fileno]) 
        bat_num=bat_num+1 
      except Exception as ex: 
       fileno=fileno+1 
     fileno=fileno+1 
    return np.maximum(np.tanh(temp_batch), 0),temp_classes #normalize in range 0->1 
+0

cProfileで実行して、snakevizを使って時間が費やされる場所を確認できますか? –

+0

素敵なアイデア..ディスクからファイルを読み込む場所がnpyioに費やされているようです。私はこれをどうやって減らすことができますか?FIFOqueueを見て、何かを実装できるかどうかを見てください。 –

答えて

3

入力データの準備と準備されたデータを使用してモデルを訓練はqueuesを使用してTensorFlowに切り離すことができます。 tf.FIFOQueueまたはtf.RandomShuffleQueueのキューを作成し、ミニバッチをtf.enqueueにエンキューすることができます。グラフのトレーニング部分は、tf.dequeueを実行してミニバッチを取得します。データ準備と訓練を異なるPythonスレッドで実行して、並行性を取得する必要があることに注意してください。詳細な説明と例については、スレッドとキューに関するhow toをご覧ください。また、データ準備+トレーニングパイプラインのスループットは、最も遅い段階で制限されることに注意してください。あなたのケースでは、ミニバッチごとのデータ準備がトレーニングステップよりも遅い場合は、複数のスレッドを実行して、トレーニングスレッドに対応するために多数のミニバッチを並列に作成する必要があります。

関連する問題