2016-07-08 142 views
8

我一直在使用單GPU(GeForce GTX 980 Ti,6GB)的適度機器上訓練Inception V3。最大批量大小看起來大約爲40在適度的硬件設置上訓練Tensorflow Inception-v3 Imagenet

我已使用inception_train.py文件中指定的默認學習率設置:initial_learning_rate = 0.1num_epochs_per_decay = 30learning_rate_decay_factor = 0.16。一對夫婦的訓練精度最好我能做到的,是如下(約500K-1M迭代)周後:

2016-06-06 12:07:52.245005: precision @ 1 = 0.5767 recall @ 5 = 0.8143 [50016 examples] 
2016-06-09 22:35:10.118852: precision @ 1 = 0.5957 recall @ 5 = 0.8294 [50016 examples] 
2016-06-14 15:30:59.532629: precision @ 1 = 0.6112 recall @ 5 = 0.8396 [50016 examples] 
2016-06-20 13:57:14.025797: precision @ 1 = 0.6136 recall @ 5 = 0.8423 [50016 examples] 

我試着朝訓練課結束的設置擺弄,但在準確性方面看不到任何改進。

我已經從頭開始了一個新的培訓課程,其中num_epochs_per_decay = 10和learning_rate_decay_factor = 0.001基於本論壇中的一些其他帖子,但它在這裏是黑暗中的一種掌握。

上好的默認值小的硬件設置,像我的任何建議?

回答

16

TL,DR:從適中的硬件設置開始,在可容忍的時間內從頭開始培訓Inception V3模型的方法尚不存在。我強烈建議對預期的任務重新訓練一個預先訓練好的模型。

在像您這樣設置的小型硬件上,很難實現最佳性能。一般來說,對CNN來說,最好的性能是可能的最大批量。這意味着對於CNN來說,訓練過程往往受限於可容納GPU內存的最大批量。

可供下載 here

先啓V3模型的1600有效批量大小被訓練在50個GPU的 - 其中每個GPU跑鑑於你謙虛硬件32

批量大小,我的頭號建議將就是從上面的鏈接下載預先訓練好的模式,然後重新訓練模型以完成您手頭的單個任務。這會讓你的生活更加快樂。

作爲一個思想實驗(但幾乎沒有實際的)..如果你感覺特別被迫正是從無到有,從訓練預先訓練模型該模型的訓練表現匹配,你可以在執行以下操作瘋狂程序你的1個GPU。也就是說,你可以運行下面的過程:

從梯度運行
  • 重複這個50倍32
  • 商店的批量大小
    1. 運行。
    2. 平均50批次的梯度。
    3. 用漸變更新所有變量。
    4. 重複

    我只提這給你的需要來完成,以實現完全一樣的性能是什麼概念的意義。鑑於你提到的速度數字,這個程序需要數月才能運行。非常實用。

    更爲現實的,如果你還是從頭開始訓練了濃厚的興趣,做你可以在最好的,這裏有一些一般準則:

    • 始終以最大的批量大小可能運行。看起來你已經這麼做了。大。
    • 確保您沒有CPU綁定。也就是說,確保輸入處理隊列總是顯示在TensorBoard上適度充滿。否則,增加預處理線程的數量或使用不同的CPU(如果可用)。
    • Re:學習率。如果您始終運行同步訓練(如果您只有一個GPU,則必須是這種情況),那麼批處理量越大,可接受的學習速率就越高。我會嘗試一系列快速運行(例如每個小時)以確定可能的最高學習,而不會導致NaN。找到這樣的學習速度後,將其降低5-10%並運行。
    • 至於num_epochs_per_decay和decay_rate,有幾種策略。由突出顯示的策略每衰減10個時期,0.001衰減因子是儘可能長時間敲擊模型,直到eval準確度漸近。然後降低學習率。這是一個很好的簡單策略。我會驗證這是您在模型監控中看到的eval準確性,並確定它在您允許模型衰減學習率之前確實漸近。最後,衰減因素有點特殊,但通過10的冪降低似乎是一個很好的經驗法則。

    再次請注意,這些是一般指導原則,其他人甚至可能會提供不同的建議。我們不能給你更具體的指導的原因是,這種大小的CNN通常不是經常在適度的硬件設置上從頭開始訓練的。