最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pytorch反向傳播中的細節(jié)-計算梯度時的默認累加操作

 更新時間:2021年06月05日 14:30:40   作者:Miracle8070  
這篇文章主要介紹了Pytorch反向傳播中的細節(jié)-計算梯度時的默認累加操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Pytorch反向傳播計算梯度默認累加

今天學習pytorch實現(xiàn)簡單的線性回歸,發(fā)現(xiàn)了pytorch的反向傳播時計算梯度采用的累加機制, 于是百度來一下,好多博客都說了累加機制,但是好多都沒有說明這個累加機制到底會有啥影響, 所以我趁著自己練習的一個例子正好直觀的看一下以及如何解決:

pytorch實現(xiàn)線性回歸

先附上試驗代碼來感受一下:

torch.manual_seed(6)
lr = 0.01   # 學習率
result = []

# 創(chuàng)建訓練數(shù)據(jù)
x = torch.rand(20, 1) * 10
y = 2 * x + (5 + torch.randn(20, 1)) 

# 構建線性回歸函數(shù)
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)
# 這里是迭代過程,為了看pytorch的反向傳播計算梯度的細節(jié),我先迭代兩次
for iteration in range(2):

    # 前向傳播
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)

    # 計算 MSE loss
    loss = (0.5 * (y - y_pred) ** 2).mean()
    
    # 反向傳播
    loss.backward()
    
    # 這里看一下反向傳播計算的梯度
    print("w.grad:", w.grad)
    print("b.grad:", b.grad)
    
    # 更新參數(shù)
    b.data.sub_(lr * b.grad)
    w.data.sub_(lr * w.grad)

上面的代碼比較簡單,迭代了兩次, 看一下計算的梯度結果:

w.grad: tensor([-74.6261])
b.grad: tensor([-12.5532])
w.grad: tensor([-122.9075])
b.grad: tensor([-20.9364])

然后我稍微加兩行代碼, 就是在反向傳播上面,我手動添加梯度清零操作的代碼,再感受一下結果:

torch.manual_seed(6)
lr = 0.01
result = []
# 創(chuàng)建訓練數(shù)據(jù)
x = torch.rand(20, 1) * 10
#print(x)
y = 2 * x + (5 + torch.randn(20, 1)) 
#print(y)
# 構建線性回歸函數(shù)
w = torch.randn((1), requires_grad=True)
#print(w)
b = torch.zeros((1), requires_grad=True)
#print(b)
for iteration in range(2):
    # 前向傳播
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)

    # 計算 MSE loss
    loss = (0.5 * (y - y_pred) ** 2).mean()
    
    # 由于pytorch反向傳播中,梯度是累加的,所以如果不想先前的梯度影響當前梯度的計算,需要手動清0
     if iteration > 0: 
        w.grad.data.zero_()
        b.grad.data.zero_()
    
    # 反向傳播
    loss.backward()
    
    # 看一下梯度
    print("w.grad:", w.grad)
    print("b.grad:", b.grad)
    
    # 更新參數(shù)
    b.data.sub_(lr * b.grad)
    w.data.sub_(lr * w.grad)

w.grad: tensor([-74.6261])
b.grad: tensor([-12.5532])
w.grad: tensor([-48.2813])
b.grad: tensor([-8.3831])

從上面可以發(fā)現(xiàn),pytorch在反向傳播的時候,確實是默認累加上了上一次求的梯度, 如果不想讓上一次的梯度影響自己本次梯度計算的話,需要手動的清零。

但是, 如果不進行手動清零的話,會有什么后果呢? 我在這次線性回歸試驗中,遇到的后果就是loss值反復的震蕩不收斂。下面感受一下:

torch.manual_seed(6)
lr = 0.01
result = []
# 創(chuàng)建訓練數(shù)據(jù)
x = torch.rand(20, 1) * 10
#print(x)
y = 2 * x + (5 + torch.randn(20, 1)) 
#print(y)
# 構建線性回歸函數(shù)
w = torch.randn((1), requires_grad=True)
#print(w)
b = torch.zeros((1), requires_grad=True)
#print(b)

for iteration in range(1000):
    # 前向傳播
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)

    # 計算 MSE loss
    loss = (0.5 * (y - y_pred) ** 2).mean()
#     print("iteration {}: loss {}".format(iteration, loss))
    result.append(loss)
    
    # 由于pytorch反向傳播中,梯度是累加的,所以如果不想先前的梯度影響當前梯度的計算,需要手動清0
    #if iteration > 0: 
    #    w.grad.data.zero_()
    #    b.grad.data.zero_()
  
    # 反向傳播
    loss.backward()
 
    # 更新參數(shù)
    b.data.sub_(lr * b.grad)
    w.data.sub_(lr * w.grad)
    
    if loss.data.numpy() < 1:
        break
   plt.plot(result)

上面的代碼中,我沒有進行手動清零,迭代1000次, 把每一次的loss放到來result中, 然后畫出圖像,感受一下結果:

沒有進行手動清零

接下來,我把手動清零的注釋打開,進行每次迭代之后的手動清零操作,得到的結果:

手動清零之后的操作

可以看到,這個才是理想中的反向傳播求導,然后更新參數(shù)后得到的loss值的變化。

總結

這次主要是記錄一下,pytorch在進行反向傳播計算梯度的時候的累加機制到底是什么樣子? 至于為什么采用這種機制,我也搜了一下,大部分給出的結果是這樣子的:

但是如果不想累加的話,可以采用手動清零的方式,只需要在每次迭代時加上即可

w.grad.data.zero_()
b.grad.data.zero_()

另外, 在搜索資料的時候,在一篇博客上看到兩個不錯的線性回歸時pytorch的計算圖在這里借用一下:

前向傳播
反向傳播

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python連接Kingbase的實現(xiàn)示例

    Python連接Kingbase的實現(xiàn)示例

    Kingbase是一種開源的數(shù)據(jù)庫管理系統(tǒng),與Oracle數(shù)據(jù)庫的語法和功能非常相似,本文主要介紹了Python連接Kingbase的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Python Django簡單實現(xiàn)session登錄注銷過程詳解

    Python Django簡單實現(xiàn)session登錄注銷過程詳解

    這篇文章主要介紹了Python Django簡單實現(xiàn)session登錄注銷過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 使用pytorch搭建AlexNet操作(微調預訓練模型及手動搭建)

    使用pytorch搭建AlexNet操作(微調預訓練模型及手動搭建)

    今天小編就為大家分享一篇使用pytorch搭建AlexNet操作(微調預訓練模型及手動搭建),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python進行PDF文件拆分的示例詳解

    Python進行PDF文件拆分的示例詳解

    在日常生活中,我們常常會遇到大型的PDF文件,難以發(fā)送,將PDF拆分成多個小文件是一個實用的解決方案,下面我們就來看看如何使用Python實現(xiàn)PDF文件拆分吧
    2025-02-02
  • python學習教程之使用py2exe打包

    python學習教程之使用py2exe打包

    py2exe是一個將python腳本轉換成windows上的可獨立執(zhí)行的可執(zhí)行程序(*.exe)的工具,下面這篇文章主要給大家介紹了關于python學習教程之使用py2exe打包的相關資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-09-09
  • Django cookie和session的應用場景及如何使用

    Django cookie和session的應用場景及如何使用

    今天我們來重點看下Django中session和cookie的用法吧。我們會介紹cookie和session的工作原理,還會分享實際應用的案例。
    2021-04-04
  • python-str,list,set間的轉換實例

    python-str,list,set間的轉換實例

    今天小編就為大家分享一篇python-str,list,set間的轉換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python爬蟲開發(fā)與項目實戰(zhàn)

    Python爬蟲開發(fā)與項目實戰(zhàn)

    本書從基本的爬蟲原理開始講解,通過介紹Pthyon編程語言和Web前端基礎知識引領讀者入門,之后介紹動態(tài)爬蟲原理以及Scrapy爬蟲框架,最后介紹大規(guī)模數(shù)據(jù)下分布式爬蟲的設計以及PySpider爬蟲框架等,需要的朋友快來下載電子版吧
    2020-12-12
  • python獲取本機外網ip的方法

    python獲取本機外網ip的方法

    這篇文章主要介紹了python獲取本機外網ip的方法,可實現(xiàn)從外網顯示IP的網站獲取本機IP的功能,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Python元組知識點總結

    Python元組知識點總結

    在本篇文章里小編給大家分享了關于Python元組的相關知識點內容,有興趣的朋友們學習下。
    2019-02-02

最新評論

罗平县| 长葛市| 和田市| 儋州市| 鄂托克旗| 若羌县| 遂平县| 曲松县| 家居| 孙吴县| 宜章县| 乐业县| 惠来县| 宝丰县| 石狮市| 五原县| 库尔勒市| 新蔡县| 延津县| 昌图县| 育儿| 老河口市| 定西市| 南投县| 蕲春县| 阜阳市| 富川| 肥乡县| 河源市| 宿迁市| 沙雅县| 浦城县| 绵阳市| 镇赉县| 手机| 临高县| 科尔| 安达市| 宝丰县| 德阳市| 朝阳区|