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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

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

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

1. 最近在學(xué)習(xí)pytorch過程中遇到了幾個(gè)問題

不理解為什么在訓(xùn)練和測(cè)試函數(shù)中model.eval(),和model.train()的區(qū)別,經(jīng)查閱后做如下整理

一般情況下,我們訓(xùn)練過程如下:

拿到數(shù)據(jù)后進(jìn)行訓(xùn)練,在訓(xùn)練過程中,使用

  • model.train():告訴我們的網(wǎng)絡(luò),這個(gè)階段是用來訓(xùn)練的,可以更新參數(shù)。

訓(xùn)練完成后進(jìn)行預(yù)測(cè),在預(yù)測(cè)過程中,使用

  • model.eval(): 告訴我們的網(wǎng)絡(luò),這個(gè)階段是用來測(cè)試的,于是模型的參數(shù)在該階段不進(jìn)行更新。

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

查閱相關(guān)資料:傳送門

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

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

另外,參考文檔說這樣避免每一個(gè)參數(shù)都要設(shè)置,解放了GPU底層的時(shí)間開銷,在測(cè)試階段統(tǒng)一梯度設(shè)置為False

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

model.eval()

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

  • 1.不進(jìn)行dropout
  • 2.不更新batchnorm的mean 和var 參數(shù)
  • 3.不進(jìn)行梯度反向傳播, 但梯度仍然會(huì)計(jì)算

torch.no_grad()

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

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

它的主要作用有2個(gè):

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

異同

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

總結(jié)

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

欄目分類
最近更新