Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解
引言
一般訓(xùn)練神經(jīng)網(wǎng)絡(luò),總是逃不開(kāi)optimizer.zero_grad之后是loss(后面有的時(shí)候還會(huì)寫(xiě)forward,看你網(wǎng)絡(luò)怎么寫(xiě)了)之后是是net.backward之后是optimizer.step的這個(gè)過(guò)程。
real_a, real_b = batch[0].to(device), batch[1].to(device)fake_b = net_g(real_a) optimizer_d.zero_grad()# 判別器對(duì)虛假數(shù)據(jù)進(jìn)行訓(xùn)練 fake_ab = torch.cat((real_a, fake_b), 1) pred_fake = net_d.forward(fake_ab.detach()) loss_d_fake = criterionGAN(pred_fake, False)# 判別器對(duì)真實(shí)數(shù)據(jù)進(jìn)行訓(xùn)練 real_ab = torch.cat((real_a, real_b), 1) pred_real = net_d.forward(real_ab) loss_d_real = criterionGAN(pred_real, True)# 判別器損失 loss_d = (loss_d_fake + loss_d_real) * 0.5loss_d.backward() optimizer_d.step()上面這是一段cGAN的判別器訓(xùn)練過(guò)程。標(biāo)題中所涉及到的這些方法,其實(shí)整個(gè)神經(jīng)網(wǎng)絡(luò)的參數(shù)更新過(guò)程(特別是反向傳播),具體是怎么操作的,我們一起來(lái)探討一下。
參數(shù)更新和反向傳播
上圖為一個(gè)簡(jiǎn)單的梯度下降示意圖。比如以SGD為例,是算一個(gè)batch計(jì)算一次梯度,然后進(jìn)行一次梯度更新。這里梯度值就是對(duì)應(yīng)偏導(dǎo)數(shù)的計(jì)算結(jié)果。顯然,我們進(jìn)行下一次batch梯度計(jì)算的時(shí)候,前一個(gè)batch的梯度計(jì)算結(jié)果,沒(méi)有保留的必要了。所以在下一次梯度更新的時(shí)候,先使用optimizer.zero_grad把梯度信息設(shè)置為0。
我們使用loss來(lái)定義損失函數(shù),是要確定優(yōu)化的目標(biāo)是什么,然后以目標(biāo)為頭,才可以進(jìn)行鏈?zhǔn)椒▌t和反向傳播。
調(diào)用loss.backward方法時(shí)候,Pytorch的autograd就會(huì)自動(dòng)沿著計(jì)算圖反向傳播,計(jì)算每一個(gè)葉子節(jié)點(diǎn)的梯度(如果某一個(gè)變量是由用戶創(chuàng)建的,則它為葉子節(jié)點(diǎn))。使用該方法,可以計(jì)算鏈?zhǔn)椒▌t求導(dǎo)之后計(jì)算的結(jié)果值。
optimizer.step用來(lái)更新參數(shù),就是圖片中下半部分的w和b的參數(shù)更新操作。
參考
[1Pytorch optimizer.step() 和loss.backward()和scheduler.step()的關(guān)系與區(qū)別
[2]torch代碼解析 為什么要使用optimizer.zero_grad()
總結(jié)
以上是生活随笔為你收集整理的Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 训练生成对抗网络的过程中,训练gan的地
- 下一篇: Python跨平台文件夹分割方法os.s