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