2016-07-06 80 views
0

我在張量流中很慢的批量加載時遇到問題。 訓練中的每一步都相當快,但是我的加載數據的功能非常緩慢。如何在張量流中優化批量加載?

我想知道是否有任何方法可以使這個速度更快,或者當列車運行正在運行時在後臺運行它,以便在完成一個步驟時可以準備批次。

我的功能存儲在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

輸入數據準備和使用準備的數據訓練的模型可以使用TensorFlow queues解耦。您可以使用tf.FIFOQueuetf.RandomShuffleQueue創建隊列,並使用tf.enqueue將您的迷你批次排入隊列。圖表的訓練部分將通過運行tf.dequeue來獲得小批量。請注意,您應該在不同的Python線程中運行數據準備和培訓以獲得併發性。有關線程和隊列的更多說明和示例,請參閱how to。另外請注意,數據準備+培訓管道的吞吐量將受到最慢階段的限制。就你而言,如果每個最小批次的數據準備工作比訓練步驟慢,則可能必須運行多個線程才能並行創建多個小批量以跟上培訓線程。