model.eval()
- 使用model.eval()切換到測試模式,不會更新模型的w(權重),b(偏置)參數
- 通知dropout層和batchnorm層在train和val中間進行切換:
- 在train模式,dropout層會按照設定的參數p設置保留激活單元的概率(保留概率=p,比如keep_prob=0.8),batchnorm層會繼續計算數據的mean和var并進行更新
- 在val模式下,dropout層會讓所有的激活單元都通過,而batchnorm層會停止計算和更新mean和var,直接使用在訓練階段已經學出的mean和var值
- model.eval()不會影響各層的gradient計算行為,即gradient計算和存儲與training模式一樣,只是不進行反向傳播(backprobagation)
torch.no_grad()
- 用于停止autograd模塊的工作,起到加速和節省顯存的作用(具體行為就是停止gradient計算,從而節省了GPU算力和顯存)
- 不會影響dropout和batchnorm層的行為
model.eval()與torch.no_grad()可以同時用,更加節省GPU的算力
- 在val模式下,為什么讓dropout層所有的激活單元都通過,因為train階段的dropout層已經屏蔽掉了一些激活單元,在val模式下,讓所有的激活單元都通過還能預測數據嗎?
- 在val模式下,讓所有的激活單元都通過當然能預測數據了,相當于學習時限定你每次只能選擇一份資料學,考試時開卷所有資料你都帶著。val模式下,雖然讓所有的激活單元都通過,但是對于各個神經元的輸出, 要乘上訓練時的刪除比例后再輸出。