網(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
相關(guān)推薦
- 2022-04-26 C#元組類型ValueTuple用法詳解_實(shí)用技巧
- 2023-03-15 Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解_docker
- 2023-05-22 關(guān)于PyTorch中nn.Module類的簡(jiǎn)介_python
- 2024-03-23 spring boot 使用AOP實(shí)現(xiàn)是否已登錄檢測(cè)
- 2022-05-31 C++核心編程之內(nèi)存分區(qū)詳解_C 語言
- 2023-04-02 pytorch中關(guān)于distributedsampler函數(shù)的使用_python
- 2023-01-14 GoLang逃逸分析講解_Golang
- 2022-05-16 docker的具名掛載與匿名掛載實(shí)現(xiàn)_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支