引言
今天在使用Pytorch導(dǎo)入此前保存的模型進(jìn)行測試,在過程中發(fā)現(xiàn)輸出的結(jié)果與驗證結(jié)果差距甚大,經(jīng)過排查后發(fā)現(xiàn)是forward與eval()順序問題。
現(xiàn)象
此前的錯誤代碼是
input_cpu = torch.ones((1, 2, 160, 160))
target_cpu =torch.ones((1, 2, 160, 160))
target_gpu, input_gpu = target_cpu.cuda(), input_cpu.cuda()
model.set_input_2(input_gpu, target_gpu)
model.eval()
model.forward()
應(yīng)該改為
input_cpu = torch.ones((1, 2, 160, 160))
target_cpu =torch.ones((1, 2, 160, 160))
target_gpu, input_gpu = target_cpu.cuda(), input_cpu.cuda()
model.set_input_2(input_gpu, target_gpu)
# 先forward再eval
model.forward()
model.eval()
當(dāng)時有個疑慮,為什么要在forward后面再加eval(),查了下相關(guān)資料,主要是在BN層以及Dropout的問題。
當(dāng)使用eval()時,模型會自動固定BN層以及Dropout,選取訓(xùn)練好的值,否則則會取平均,可能導(dǎo)致生成的圖片顏色失真。
PyTorch進(jìn)行訓(xùn)練和測試時一定注意要把實例化的model指定train/eval
使用PyTorch進(jìn)行訓(xùn)練和測試時一定注意要把實例化的model指定train/eval,eval()時,框架會自動把BN和DropOut固定住,不會取平均,而是用訓(xùn)練好的值,不然的話,一旦test的batch_size過小,很容易就會被BN層導(dǎo)致生成圖片顏色失真極大?。。。。?!
eg:
Class Inpaint_Network()
......
Model = Inpaint_Nerwoek()
#train:
Model.train(mode=True)
.....
#test:
Model.eval()
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Pytorch evaluation每次運行結(jié)果不同的解決
- pytorch加載預(yù)訓(xùn)練模型與自己模型不匹配的解決方案
- 踩坑:pytorch中eval模式下結(jié)果遠(yuǎn)差于train模式介紹