以前一直有個(gè)疑問(wèn)勃蜘,開始建立好模型,如果既沒(méi)有執(zhí)行net.train()也沒(méi)有執(zhí)行net.eval()時(shí)候模型處于哪種情況?
近天測(cè)試了一下,建立好的模型是處于 .train()模式下的:
調(diào)試過(guò)程中查看網(wǎng)絡(luò)的 net.training 的值沐批。
然后執(zhí)行下一步net.eval(),之后查看net.training 的屬性值:
然后執(zhí)行net.train()查看一下net.training的值:
下面進(jìn)行一組對(duì)照試驗(yàn)蝎亚,驗(yàn)證網(wǎng)絡(luò)處于 train 或 eval 模式中的時(shí)候九孩,最后的出的結(jié)果是不一樣的 :
訓(xùn)練完train_datasets之后,model要來(lái)測(cè)試樣本了发框。在model(test_datasets)之前躺彬,需要加上model.eval(). 否則的話,有輸入數(shù)據(jù)梅惯,即使不訓(xùn)練宪拥,它也會(huì)改變權(quán)值。這是model中含有batch normalization層所帶來(lái)的的性質(zhì)铣减。
eval()時(shí)她君,pytorch會(huì)自動(dòng)把BN和DropOut固定住,不會(huì)取平均徙歼,而是用訓(xùn)練好的值犁河。
不然的話,一旦test的batch_size過(guò)小魄梯,很容易就會(huì)被BN層導(dǎo)致生成圖片顏色失真極大桨螺。eval()在非訓(xùn)練的時(shí)候是需要加的,沒(méi)有這句代碼酿秸,一些網(wǎng)絡(luò)層的值會(huì)發(fā)生變動(dòng)灭翔,不會(huì)固定,你神經(jīng)網(wǎng)絡(luò)每一次生成的結(jié)果也是不固定的,生成質(zhì)量可能好也可能不好肝箱。
這幾篇博客較好的解釋了droupout和BN層:
深度學(xué)習(xí)(二十九)Batch Normalization 學(xué)習(xí)筆記(贊贊)
Batch Normalization 簡(jiǎn)單理解
1.當(dāng)模型始終處于 train 模式中:
結(jié)果:
2.當(dāng)模型始終處于 eval 模式中:
結(jié)果:
3. 當(dāng)模型先處于eval 模式哄褒,后處于train 模式:
結(jié)果:
4. 當(dāng)模型先處于train 模式,后處于train 模式:
結(jié)果: