Pytorch的backward()与optim.setp()的理解
生活随笔
收集整理的這篇文章主要介紹了
Pytorch的backward()与optim.setp()的理解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
@Xia
Pytorch的backward()與optim.setp()的理解
backward()與optim.setp()一直對這兩個(gè)函數(shù)他們之間的調(diào)用不是很清楚,花點(diǎn)時(shí)間應(yīng)該是搞明白了。
先看最簡單的bp回歸梯度下降的代碼
for epoch in range(num_epoch):for i, data in enumerate(train_loader):optimizer.zero_grad() # 用 optimizer 將 model 參數(shù)的 gradient 歸零train_pred = model(data[0].cuda()) # 利用 model 得到預(yù)測的機(jī)率分佈 這邊實(shí)際上就是去呼叫 model 的 forward 函數(shù)batch_loss = loss(train_pred, data[1].cuda()) # 計(jì)算 loss (注意 prediction 跟 label 必須同時(shí)在 CPU 或是 GPU 上)batch_loss.backward() # 利用 back propagation 算出每個(gè)參數(shù)的 gradientoptimizer.step() # 以 optimizer 用 gradient 更新參數(shù)值我的疑問
CSDN有很多資料,backward函數(shù)其實(shí)就是計(jì)算梯度,只是計(jì)算。
輸出
tensor([72.])參考:https://blog.csdn.net/qq_24884193/article/details/109517890
那么optim.step()函數(shù)做了什么呢?
本質(zhì)上就是對計(jì)算出來的梯度就行最優(yōu)化,不贅述。
Loss函數(shù)和backward函數(shù)有什么關(guān)系?
其實(shí)Loss函數(shù)就是相當(dāng)于對CNN網(wǎng)絡(luò)的輸出再進(jìn)行了一次function(函數(shù)),這個(gè)function(函數(shù))的輸出就叫做loss,我們對loss求backward,即loss.backward(),下面代碼就是最簡單的例子,只不過m不是卷積神經(jīng)網(wǎng)絡(luò)的輸出,而是簡單的線性函數(shù)。
這個(gè)問題其實(shí)上個(gè)問題其實(shí)可以回答,Loss函數(shù)傳遞的類型是tensor,其中包括grad屬性,用來保存對應(yīng)的梯度值。
并且tensor類型會(huì)記錄網(wǎng)絡(luò)結(jié)構(gòu)(參考問題3中,對loss計(jì)算梯度,可以遞歸的計(jì)算出 loss對x的微分),所以雖然計(jì)算Loss沒有傳遞model參數(shù),但實(shí)際上tensor類型的參數(shù)中已經(jīng)有了。
總結(jié)
以上是生活随笔為你收集整理的Pytorch的backward()与optim.setp()的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: macOS清理 Office 许可证文件
- 下一篇: 【Source Insight】SI工具