Python Pytorch深度學(xué)習(xí)之自動(dòng)微分
一、簡(jiǎn)介
antograd包是Pytorch中所有神經(jīng)網(wǎng)絡(luò)的核心。autograd為Tensor上的所有操作提供自動(dòng)微分,它是一個(gè)由運(yùn)行定義的框架,這意味著以代碼運(yùn)行方式定義后向傳播,并且每一次迭代都可能不同
二、TENSOR
torch.Tensor是包的核心。
1.如果將屬性.requires_grad設(shè)置為True,則會(huì)開始跟蹤針對(duì)tensor的所有操作。
2.完成計(jì)算之后,可以調(diào)用backward()來(lái)自帶計(jì)算多有梯度。該張量的梯度將積累到.grad屬性中。
3.要停止tensor歷史記錄的跟蹤,可以調(diào)用.detach(),他將與計(jì)算歷史記錄分離,并防止將來(lái)的計(jì)算被跟蹤
4.要停止跟蹤歷史記錄(和使用內(nèi)存),可以將代碼塊使用with torch.no_grad():包裝起來(lái)。在評(píng)估模型時(shí)候,很有用,因?yàn)槟P驮谟?xùn)練階段具有requires_grad=True的可訓(xùn)練參數(shù)有利于調(diào)參,但是在評(píng)估階段不需要梯度
5.還有一個(gè)對(duì)于autograd實(shí)現(xiàn)非常重要的就是Function。tensor和Function互相連接并構(gòu)建一個(gè)肺循環(huán)圖,他保存整個(gè)完整的計(jì)算過(guò)程的歷史信息。每個(gè)張量都有一個(gè).grad_fn屬性保存著創(chuàng)建了張量的Function的引用(如果用戶自己創(chuàng)建的張量,那么grad_fn是None)
6.如果想計(jì)算導(dǎo)數(shù),可以調(diào)用Tensor.backward().如果Tensor是標(biāo)量(包含一個(gè)元素?cái)?shù)據(jù))則不需要指定任何參數(shù)backward(),但是如果他有更多元素,則需要指定gradient參數(shù)來(lái)指定張量的形狀
import torch # 創(chuàng)建一個(gè)張量,設(shè)置requires_grad=True x=torch.ones(2,2,requires_grad=True) print(x) # 針對(duì)張量操作 y=x+2 print(y) print(y.grad_fn)#y作為操作的結(jié)果被創(chuàng)建,所以他有g(shù)rad_fn # 對(duì)y操作 z=y*y*3 out=z.mean() print(z,out)
運(yùn)行結(jié)果
# 如果在變量輸入過(guò)程中沒(méi)有提供相應(yīng)參數(shù),輸入的標(biāo)記默認(rèn)為False,requires_grad_()會(huì)改變張量的requires_grad標(biāo)記 a=torch.randn(2, 2) a=((a*3)/(a-1)) # 前面沒(méi)有設(shè)置requires_grad,固會(huì)輸出False print(a.requires_grad) a.requires_grad_(True) # 經(jīng)過(guò)上面語(yǔ)句的更改之后,此處應(yīng)該輸出True print(a.requires_grad) b=(a*a).sum() # 輸出梯度信息 print(b.grad_fn)
運(yùn)行結(jié)果
三、梯度
現(xiàn)在向后傳播,因?yàn)檩敵霭艘粋€(gè)標(biāo)量,out,backward()等同于out.backward(torch.tensor(1,))
out.backward()#向后傳播 print(x.grad)#打印梯度
運(yùn)行結(jié)果
原理
四、Example——雅克比向量積
# 雅克比向量積 x=torch.randn(3,requires_grad=True) y=x*2 print(y) while y.data.norm()<1000: y=y*2 print(y)#此時(shí)y不是標(biāo)量,torch.autograd 不能夠直接計(jì)算整個(gè)雅可比,但是如果我們只想要雅可比向量積,只需要簡(jiǎn)單的傳遞向量給 backward 作為參數(shù) v=torch.tensor([0.1,1.0,0.0001],dtype=torch.float) y.backward(v) print(x.grad) print(x.requires_grad) print((x**2).requires_grad) # 使用一下語(yǔ)句停止從跟蹤歷史中.require_gra=True的張量自動(dòng)求導(dǎo) with torch.no_grad(): print((x**2).requires_grad)
運(yùn)行結(jié)果
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
tensorflow 報(bào)錯(cuò)unitialized value的解決方法
今天小編就為大家分享一篇tensorflow 報(bào)錯(cuò)unitialized value的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02淺談插入排序算法在Python程序中的實(shí)現(xiàn)及簡(jiǎn)單改進(jìn)
這篇文章主要介紹了插入排序算法在Python程序中的實(shí)現(xiàn)及簡(jiǎn)單改進(jìn),插入排序算法的最差時(shí)間復(fù)雜度為O(n^2),最優(yōu)時(shí)間復(fù)雜度為O(n),存在一定的優(yōu)化空間,需要的朋友可以參考下2016-05-05淺析Python數(shù)字類型和字符串類型的內(nèi)置方法
這篇文章主要介紹了Python數(shù)字類型和字符串類型的內(nèi)置方法,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12詳解Pytorch如何利用yaml定義卷積網(wǎng)絡(luò)
大多數(shù)卷積神經(jīng)網(wǎng)絡(luò)都是直接通過(guò)寫一個(gè)Model類來(lái)定義的,這樣寫的代碼其實(shí)是比較好懂,也很方便。但是本文將介紹另一個(gè)方法:利用yaml定義卷積網(wǎng)絡(luò),感興趣的可以了解一下2022-10-10Python 中如何使用 setLevel() 設(shè)置日志級(jí)別
這篇文章主要介紹了在 Python 中使用setLevel() 設(shè)置日志級(jí)別,Python 提供了一個(gè)單獨(dú)的日志記錄模塊作為其標(biāo)準(zhǔn)庫(kù)的一部分,以簡(jiǎn)化日志記錄,本文將討論日志記錄 setLevel 及其在 Python 中的工作方式,需要的朋友可以參考下2023-07-07python pandas模糊匹配 讀取Excel后 獲取指定指標(biāo)的操作
這篇文章主要介紹了python pandas模糊匹配 讀取Excel后 獲取指定指標(biāo)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03一道題學(xué)會(huì)Python函數(shù)中形參和實(shí)參
在Python編程中,函數(shù)的形參和實(shí)參是函數(shù)定義和調(diào)用的重要概念,本文主要介紹了一道題學(xué)會(huì)Python函數(shù)中形參和實(shí)參,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01python實(shí)現(xiàn)圖片加文字水印OPenCV和PIL庫(kù)
本文來(lái)為大家介紹一下,使用python中的庫(kù)實(shí)現(xiàn)給圖片添加文字水印,openCV可以給圖片添加水印,如果要添加漢字水印那就要使用PIL庫(kù)2021-09-09