日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Pytorch中的modle.train,model.eval,with?torch.no_grad解讀_python

作者:l8947943 ? 更新時間: 2023-01-13 編程語言

modle.train,model.eval,with torch.no_grad解讀

1. 最近在學習pytorch過程中遇到了幾個問題

不理解為什么在訓練和測試函數中model.eval(),和model.train()的區別,經查閱后做如下整理

一般情況下,我們訓練過程如下:

拿到數據后進行訓練,在訓練過程中,使用

  • model.train():告訴我們的網絡,這個階段是用來訓練的,可以更新參數。

訓練完成后進行預測,在預測過程中,使用

  • model.eval(): 告訴我們的網絡,這個階段是用來測試的,于是模型的參數在該階段不進行更新。

2. 但是為什么在eval()階段會使用with torch.no_grad()?

查閱相關資料:傳送門

with torch.no_grad - disables tracking of gradients in autograd.
model.eval() changes the forward() behaviour of the module it is called upon
? ? ? ?eg, it disables dropout and has batch norm use the entire population statistics

總結一下就是說,在eval階段了,即使不更新,但是在模型中所使用的dropout或者batch norm也就失效了,直接都會進行預測,而使用no_grad則設置讓梯度Autograd設置為False(因為在訓練中我們默認是True),這樣保證了反向過程為純粹的測試,而不變參數。

另外,參考文檔說這樣避免每一個參數都要設置,解放了GPU底層的時間開銷,在測試階段統一梯度設置為False

model.eval()與torch.no_grad()的作用

model.eval()

經常在模型推理代碼的前面, 都會添加model.eval(), 主要有3個作用:

  • 1.不進行dropout
  • 2.不更新batchnorm的mean 和var 參數
  • 3.不進行梯度反向傳播, 但梯度仍然會計算

torch.no_grad()

torch.no_grad的一般使用方法是, 在代碼塊外面用with torch.no_grad()給包起來。 如下面這樣:

with torch.no_grad():
?? ?# your code?

它的主要作用有2個:

  • 1.不進行梯度的計算(當然也就沒辦法反向傳播了), 節約顯存和算力
  • 2.dropout和batchnorn還是會正常更新

異同

從上面的介紹中可以非常明確的看出,它們的相同點是一般都用在推理階段, 但它們的作用是完全不同的, 也沒有重疊。 可以一起使用。

總結

原文鏈接:https://blog.csdn.net/l8947943/article/details/103730804

欄目分類
最近更新