淺談pytorch中為什么要用 zero_grad() 將梯度清零
pytorch中為什么要用 zero_grad() 將梯度清零
調(diào)用backward()函數(shù)之前都要將梯度清零,因?yàn)槿绻荻炔磺辶?,pytorch中會(huì)將上次計(jì)算的梯度和本次計(jì)算的梯度累加。
這樣邏輯的好處是,當(dāng)我們的硬件限制不能使用更大的bachsize時(shí),使用多次計(jì)算較小的bachsize的梯度平均值來(lái)代替,更方便,壞處當(dāng)然是每次都要清零梯度。
optimizer.zero_grad() output = net(input) loss = loss_f(output, target) loss.backward()
補(bǔ)充:Pytorch 為什么每一輪batch需要設(shè)置optimizer.zero_grad
CSDN上有人寫(xiě)過(guò)原因,但是其實(shí)寫(xiě)得繁瑣了。
根據(jù)pytorch中的backward()函數(shù)的計(jì)算,當(dāng)網(wǎng)絡(luò)參量進(jìn)行反饋時(shí),梯度是被積累的而不是被替換掉;但是在每一個(gè)batch時(shí)毫無(wú)疑問(wèn)并不需要將兩個(gè)batch的梯度混合起來(lái)累積,因此這里就需要每個(gè)batch設(shè)置一遍zero_grad 了。
其實(shí)這里還可以補(bǔ)充的一點(diǎn)是,如果不是每一個(gè)batch就清除掉原有的梯度,而是比如說(shuō)兩個(gè)batch再清除掉梯度,這是一種變相提高batch_size的方法,對(duì)于計(jì)算機(jī)硬件不行,但是batch_size可能需要設(shè)高的領(lǐng)域比較適合,比如目標(biāo)檢測(cè)模型的訓(xùn)練。
關(guān)于這一點(diǎn)可以參考這里
關(guān)于backward()的計(jì)算可以參考這里
補(bǔ)充:pytorch 踩坑筆記之w.grad.data.zero_()
在使用pytorch實(shí)現(xiàn)多項(xiàng)線(xiàn)性回歸中,在grad更新時(shí),每一次運(yùn)算后都需要將上一次的梯度記錄清空,運(yùn)用如下方法:
w.grad.data.zero_() b.grad.data.zero_()
但是,運(yùn)行程序就會(huì)報(bào)如下錯(cuò)誤:

報(bào)錯(cuò),grad沒(méi)有data這個(gè)屬性,
原因是,在系統(tǒng)將w的grad值初始化為none,第一次求梯度計(jì)算是在none值上進(jìn)行報(bào)錯(cuò),自然會(huì)沒(méi)有data屬性
修改方法:添加一個(gè)判斷語(yǔ)句,從第二次循環(huán)開(kāi)始執(zhí)行求導(dǎo)運(yùn)算
for i in range(100):
y_pred = multi_linear(x_train)
loss = getloss(y_pred,y_train)
if i != 0:
w.grad.data.zero_()
b.grad.data.zero_()
loss.backward()
w.data = w.data - 0.001 * w.grad.data
b.data = b.data - 0.001 * b.grad.data
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Django 添加首頁(yè)尾頁(yè)上一頁(yè)下一頁(yè)代碼實(shí)例
這篇文章主要介紹了Python Django 添加首頁(yè)尾頁(yè)上一頁(yè)下一頁(yè)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python中Generators教程的實(shí)現(xiàn)
本文主要介紹了Python中Generators教程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python multiprocessing多進(jìn)程原理與應(yīng)用示例
這篇文章主要介紹了Python multiprocessing多進(jìn)程原理與應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了基于multiprocessing包的多進(jìn)程概念、原理及相關(guān)使用操作技巧,需要的朋友可以參考下2019-02-02
python 如何做一個(gè)識(shí)別率百分百的OCR
最近在做游戲自動(dòng)化(測(cè)試),也就是游戲腳本了。主要有以下幾個(gè)需求識(shí)別率百分百、速度要快、模型要小,本文就來(lái)著手實(shí)現(xiàn)它2021-05-05
python小練習(xí)之爬魷魚(yú)游戲的評(píng)價(jià)生成詞云
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python爬取熱火的魷魚(yú)游戲評(píng)價(jià),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-10-10
PyQt實(shí)現(xiàn)異步數(shù)據(jù)庫(kù)請(qǐng)求的實(shí)戰(zhàn)記錄
開(kāi)發(fā)軟件的時(shí)候不可避免要和數(shù)據(jù)庫(kù)發(fā)生交互,但是有些 SQL 請(qǐng)求非常耗時(shí),如果在主線(xiàn)程中發(fā)送請(qǐng)求,可能會(huì)造成界面卡頓,本文將介紹一種讓數(shù)據(jù)庫(kù)請(qǐng)求變得和前端的 ajax 請(qǐng)求一樣簡(jiǎn)單,希望對(duì)大家有所幫助2023-12-12
python處理emoji表情(兩個(gè)函數(shù)解決兩者之間的聯(lián)系)
這篇文章主要介紹了python處理emoji表情,主要通過(guò)兩個(gè)函數(shù)解決兩者之間的聯(lián)系,本文通過(guò)實(shí)例代碼給大家介紹的非常完美,對(duì)python emoji表情的相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05

