pytorch中關(guān)于backward的幾個(gè)要點(diǎn)說(shuō)明
pytorch中backward的2個(gè)要點(diǎn)
1. requires_grad
用pytorch定義一個(gè)網(wǎng)絡(luò)層,如果數(shù)據(jù)中加入requires_grad=True,那么對(duì)于這個(gè)變量而言,就有了屬于自己的導(dǎo)數(shù)(grad),如果這個(gè)數(shù)據(jù)是矩陣,那么他的grad是同樣大小的一個(gè)矩陣。
我們將requires_grad視為該變量的一個(gè)屬性,我們知道,我們?cè)诂F(xiàn)實(shí)生活中,或者說(shuō)在神經(jīng)網(wǎng)絡(luò)中,大部分的函數(shù)都是一階連續(xù)可微的,也就是說(shuō),他的梯度具有唯一性。requires_grad的存在非常合理。
2. scale才能有backward
scale是標(biāo)量的意思。
首先我們可用用如下語(yǔ)句查看等式中某個(gè)自變量的梯度。
print(x.grad, y.grad)
但是有個(gè)前提,我們必須要先對(duì)他的結(jié)果使用.backward()才能去查看,不然的話,他的梯度會(huì)顯示為none。
非常需要注意的一點(diǎn)是,能夠使用.backward()的必須是標(biāo)量(scale),不然程序會(huì)報(bào)錯(cuò)。
結(jié)合實(shí)際的情況,我們看任何一個(gè)網(wǎng)絡(luò),使用backward的地方幾乎只有一個(gè),那就是loss.backward()。
首先loss肯定是一個(gè)標(biāo)量,無(wú)論是MSE還是交叉熵,也無(wú)論是否加上了正則項(xiàng),那都是求和之后的結(jié)果,也就是一個(gè)數(shù)值。這一點(diǎn)非常重要。
以下是我隨意寫的一個(gè)網(wǎng)絡(luò)層,可以感受一下
import torch import torch.nn as nn class Linear(nn.Module): ? ? def __init__(self, inc, mult): ? ? ? ? super(Linear, self).__init__() ? ? ? ? self.intc = inc ? ? ? ? self.mult = mult ? ? def forward(self, input0): ? ? ? ? return torch.sum(torch.abs(input0*self.mult+self.intc)) def main(): ? ? x = torch.tensor(1.0, requires_grad=True) ? ? y = torch.tensor(2.0,requires_grad=True) ? ? z = x**2+y ? ? p = z*2+x ? ? p.backward() ? ? print(z, x.grad, y.grad) ? ? A = torch.ones([3,3],requires_grad=True) ? ? print(A.requires_grad) ? ? f = Linear(1, -2) ? ? b = f(A) ? ? print(b) ? ? b.backward() ? ? print(A.grad) if __name__ == '__main__': ? ? main()
pytorch中backward參數(shù)含義
1.標(biāo)量與矢量問題
backward參數(shù)是否必須取決于因變量的個(gè)數(shù),從數(shù)據(jù)中表現(xiàn)為標(biāo)量和矢量;
- 例如標(biāo)量時(shí)
- y=一個(gè)明確的值
- 矢量時(shí)
y=[y1,y2]
2.backward 參數(shù)計(jì)算公式
當(dāng)因變量公式不是一個(gè)標(biāo)量時(shí),需要顯式添加一個(gè)參數(shù)進(jìn)行計(jì)算,以pytorch文檔示例說(shuō)明:
import torch a = torch.tensor([2., 3.], requires_grad=True) b = torch.tensor([6., 4.], requires_grad=True) Q = 3*a**3 - b**2
例如求解公式
external_grad = torch.tensor([1., 1.]) Q.backward(gradient=external_grad)
可以看到backward參數(shù)為[1,1],具體計(jì)算的含義,我們把Q公式拆分為標(biāo)量形式即:
backward參數(shù)為[1,1],計(jì)算公式為
3.autograd
torch.autograd是計(jì)算向量和雅可比公式的乘積的引擎:
其中J就是因變量與自變量的雅可比公式,v即backward中的參數(shù);類比于第二節(jié)的例子可對(duì)應(yīng);
前向傳播得到數(shù)值后,利用此形式計(jì)算直接后向傳播計(jì)算出損失函數(shù)對(duì)應(yīng)各權(quán)值的梯度下降值
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何將matlab數(shù)據(jù)導(dǎo)入到Python中使用
這篇文章主要介紹了如何將matlab數(shù)據(jù)導(dǎo)入到Python中使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼
這篇文章主要介紹了使用PyQt5實(shí)現(xiàn)圖片查看器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列
這篇文章主要介紹了pandas 實(shí)現(xiàn)將兩列中的較大值組成新的一列,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-03-03Python數(shù)據(jù)結(jié)構(gòu)列表
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)列表,本文重點(diǎn)內(nèi)容主要是對(duì)列表數(shù)據(jù)結(jié)構(gòu)的使用,在Python中,序列是一組按順序排列的值。Python?有?3?種內(nèi)置的序列類型:字符串、?元組和列表,下面一起進(jìn)入文章了解更詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下</P><P>2021-12-12python-itchat 統(tǒng)計(jì)微信群、好友數(shù)量,及原始消息數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇python-itchat 統(tǒng)計(jì)微信群、好友數(shù)量,及原始消息數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-02-02在Python中通過getattr獲取對(duì)象引用的方法
今天小編就為大家分享一篇在Python中通過getattr獲取對(duì)象引用的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-01-01Pycharm中import?torch報(bào)錯(cuò),python中import?torch不報(bào)錯(cuò)的解決
這篇文章主要介紹了Pycharm中import?torch報(bào)錯(cuò),python中import?torch不報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01