日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pytorch的backward()与optim.setp()的理解

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 更新參數值

我的疑問

  • backward函數到底干了什么?
    CSDN有很多資料,backward函數其實就是計算梯度,只是計算。
  • x=th.ones(1,requires_grad=True) z=x+1 y=z**3 t=y+2 m=t*6m.backward() print(x.grad)

    輸出

    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不是卷積神經網絡的輸出,而是簡單的線性函數。

  • x=th.ones(1,requires_grad=True) z=x+1 y=z**3 t=y+2 m=t*6 loss=Loss(m) #具體的參數,由不同的Loss函數確定 loss.backward()
  • 我看Loss函數的傳參并沒有傳遞model的參數,如果保存梯度呢?
    這個問題其實上個問題其實可以回答,Loss函數傳遞的類型是tensor,其中包括grad屬性,用來保存對應的梯度值。
    并且tensor類型會記錄網絡結構(參考問題3中,對loss計算梯度,可以遞歸的計算出 loss對x的微分),所以雖然計算Loss沒有傳遞model參數,但實際上tensor類型的參數中已經有了。
  • 總結

    以上是生活随笔為你收集整理的Pytorch的backward()与optim.setp()的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。