好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

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

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

熱門標簽:地圖標注自己和別人標注區(qū)別 商家地圖標注海報 海外網(wǎng)吧地圖標注注冊 打電話機器人營銷 聊城語音外呼系統(tǒng) ai電銷機器人的優(yōu)勢 孝感營銷電話機器人效果怎么樣 騰訊地圖標注沒法顯示 南陽打電話機器人

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)) 

# 構(gòu)建線性回歸函數(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)

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

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

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

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)
# 構(gòu)建線性回歸函數(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)
# 構(gòu)建線性回歸函數(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中, 然后畫出圖像,感受一下結(jié)果:

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

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

總結(jié)

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

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

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

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


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

您可能感興趣的文章:
  • pytorch 梯度NAN異常值的解決方案
  • pytorch 權(quán)重weight 與 梯度grad 可視化操作
  • PyTorch 如何檢查模型梯度是否可導
  • 淺談pytorch中為什么要用 zero_grad() 將梯度清零
  • PyTorch梯度裁剪避免訓練loss nan的操作
  • PyTorch 如何自動計算梯度
  • Pytorch獲取無梯度TorchTensor中的值

標簽:六盤水 南寧 聊城 揚州 撫州 迪慶 牡丹江 楊凌

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Pytorch反向傳播中的細節(jié)-計算梯度時的默認累加操作》,本文關(guān)鍵詞  Pytorch,反向,傳播,中的,細節(jié),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Pytorch反向傳播中的細節(jié)-計算梯度時的默認累加操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于Pytorch反向傳播中的細節(jié)-計算梯度時的默認累加操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 美女的mm视频app| ??男生???男生??里免费| 精品女同同性视频很黄很色| 网吧被黑人玩h文| 亚洲综合中文| 久久WW精品W免费人成女人 | 亚洲精品巨爆乳无码大乳巨学生| 日韩在线一区二区精品视频| 极品撕开美女衣服| 锵锵锵锵锵锵锵锵锵好大好深在线观看免费| 乳欲人妻1~5集动漫无删减| 777米奇第四在线观看| 下面痒好想做快给我| 黄色录像免费看| 爽?躁多水?快?深点触手| 国产欧美整片∧v| 国内精品久久久久久久果冻传媒 | 两个男生的动漫| 最惨的女体拷问研究所| 美女脱衣服无遮挡| 国产精品逍遥阁海角社区| 99AV精品国产人妻一区二区| 秋霞理伦| 穆桂英双乳高耸A片| 黑人巨大| 被继夫调教的小说h| 成人性生交大片免费看久久丫小说| 免费?无码?国产床戏| 一个添下面两个吃奶把腿抬高| 国产精产国品一二三产区区别 | 日本吮乳吃奶头XXⅩ视频下载| 欧美裸女视频| 久久韩国演艺圈悲惨事件| 久久久国产精品无码一区二区三区| 免费Gay网站Gv2022猛男| bl双性啊好烫尿进来了| 乡村乱情小雷| 三人弄娇妻高潮3p| 精品亚洲sss在线观看| 大片刺激免费播放视频| 含着岳的丝袜美足脚趾电影 |