網站首頁 編程語言 正文
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
相關推薦
- 2022-08-31 python中ndarray數組的索引和切片的使用_python
- 2022-04-25 .NET避免裝箱的方法_實用技巧
- 2022-08-01 C++簡單又好用的基本運算符重載_C 語言
- 2022-05-17 Spring boot 集成Redis客戶端Lettuce,導致服務線程數不斷增加
- 2024-03-09 【Redis】Redis中的布隆過濾器
- 2022-04-08 詳解RIFF和WAVE音頻文件格式_相關技巧
- 2022-09-13 go語言中切片Slice與數組Array對比以及panic:?runtime?error:?inde
- 2022-05-12 Kotlin 初始化陷阱。初始化注意事項
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支