簡體   English   中英

難以理解 ResNet 的實現

[英]Trouble Understanding ResNet Implementation

我在理解和復制 CIFAR-10 數據集上的 ResNet 的原始實現時遇到了麻煩,如論文“用於圖像識別的深度殘差學習”中所述。 具體來說,我對以下段落有幾個問題:

我們使用 0.0001 的權重衰減和 0.9 的動量,並采用 [13] 和 BN [16] 中的權重初始化,但沒有 dropout。 這些模型在兩個 GPU 上以 128 的 minibatch 大小進行訓練。 我們從 0.1 的學習率開始,在 32k 和 48k 迭代時將其除以 10,並在 64k 迭代時終止訓練,這取決於 45k/5k 訓練/驗證拆分。 我們遵循 [24] 中的簡單數據增強進行訓練:每邊填充 4 個像素,並從填充圖像或其水平翻轉中隨機采樣 32×32 裁剪。 為了測試,我們只評估原始 32×32 圖像的單視圖。

  1. 兩個 GPU 上 128 的 minibatch 大小意味着什么? 這是否意味着每個 GPU 的批量大小為 64?

  2. 如何從迭代轉換為紀元? 模型是否訓練了 64000 * 128/45000 = 182.04 epochs?

  3. 如何在 PyTorch 中實現訓練和學習率調度? 由於 45000 不能被 128 整除,我應該在每個 epoch 刪除最后 72 張圖像嗎? 另外,由於 32k、48k 和 64k 里程碑不屬於整數個時期,我應該將它們四舍五入到最近的時期嗎? 或者有沒有辦法改變學習率並在一個時期的中間終止訓練?

如果有人能指出我正確的方向,我將不勝感激。 我是深度學習的新手,所以感謝您的幫助和善意的理解。

  1. 兩個 GPU 上 128 的 minibatch 大小意味着什么? 這是否意味着每個 GPU 的批量大小為 64?

正如您所說,在同一台機器上運行兩個 GPU 時,批量大小在 GPU 之間分配。 兩個 GPU 產生的梯度將被傳輸、平均並應用到其中一個 GPU 上,或者可能在 CPU 上。

這里有更多信息: https ://pytorch.org/tutorials/beginner/former_torchies/parallelism_tutorial.html

  1. 如何從迭代轉換為紀元? 模型是否訓練了 64000 * 128/45000 = 182.04 epochs?

我鼓勵每個人都從迭代而不是時代的角度來思考。 每次迭代都相當於一次權重更新,這與模型收斂的相關性比一個時期要大得多。 如果您認為以 epochs 為單位,則每次嘗試不同的批量大小時都必須調整訓練的 epochs 數。 如果您根據迭代(也稱為訓練步驟或權重更新)來思考,情況並非如此。 但是你的公式在計算時代是正確的。

  1. 如何在 PyTorch 中實現訓練和學習率調度?

我認為這個 pytorch 帖子回答了這個問題,看起來這是被添加到 pytorch 中的(對不起這里的非權威答案,我更熟悉 Tensorflow):

https://forums.pytorchlightning.ai/t/training-for-a-set-number-of-iterations-without-setting-epochs/178

https://github.com/Lightning-AI/lightning/pull/5687

當然,您也可以只使用時期,並且調整學習率不必與論文描述的完全相同,只要您可以合理地接近舍入誤差就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM