2017-08-03 33 views
0

我有一個用於培訓CNN的數據生成器,並且工作正常。現在我想通過以下cifar10_multi_gpu_train.py加速2個GPU(1個pc上)的訓練。 (https://www.tensorflow.org/programmers_guide/threading_and_queues如何從數據生成器轉換爲tensorflow隊列以進行多GPU訓練。 cifar10_multi_gpu_train.py示例

問題:

1)如何轉換數據生成排隊?數據項目:(圖像文件目錄,輸出)。整個數據集:數據項目列表。批量數據集:部分整個數據集。如何把它放入張量如下:

batch_queue = tf.contrib.slim.prefetch_queue.prefetch_queue(
     [images, labels], capacity=2 * FLAGS.num_gpus) 

2)什麼是隊列的內容?

1.a)隊列需要整個數據集還是單個批處理數據集?

1.b)在我看來,在cifar10樣本中,隊列是1批。但是,它是如何遍歷所有數據集的?

1.c)如果隊列採用整個數據集,那麼gpu的每個線程中的數據是什麼?在這種情況下,我不確定我是否可以同時進行GPU訓練,因爲用於計算損失和梯度的每個數據集都取決於相同的模型狀態。但是,下一個數據集計算的下一個損失+梯度只有在最後一個完成後才能修改模型權重。可能工作

回答

0

一種方法是這樣的:

  • 建立名單

    image_list = [("file%d" % i) for i in range(100)] 
    label_list = read_label_list_from_disk(path) 
    
  • 轉換image_list和label_list到張量

  • 生產者

    image_filename_queue, label_queue = 
         tf.slice_input_producer([image_tensor, label_tensor], ..) 
    
  • 讀者

    reader =tf.WholeFileReader() 
    key, value = reader.read(image_filename_queue) 
    images = tf.image.decode_png(value)` 
    
  • 配料

    image_batch, label_batch = 
         tf.train.batch([images,labels_queue],batch_size=batch_size) 
    
  • 預取

    batch_queue = tf.contrib.slim.prefetch_queue.prefetch_queue(
            [image_batch, label_batch], capacity=2*gpus) 
    

希望,這說明在Tensorflow隊列的概念也是如此。

相關問題