亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解

 更新時(shí)間:2019年08月18日 10:51:20   作者:manong_wxd  
今天小編就為大家分享一篇關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

自動(dòng)求導(dǎo)機(jī)制

從后向中排除子圖

每個(gè)變量都有兩個(gè)標(biāo)志:requires_grad和volatile。它們都允許從梯度計(jì)算中精細(xì)地排除子圖,并可以提高效率。

requires_grad

如果有一個(gè)單一的輸入操作需要梯度,它的輸出也需要梯度。相反,只有所有輸入都不需要梯度,輸出才不需要。如果其中所有的變量都不需要梯度進(jìn)行,后向計(jì)算不會(huì)在子圖中執(zhí)行。

>>> x = Variable(torch.randn(5, 5))
>>> y = Variable(torch.randn(5, 5))
>>> z = Variable(torch.randn(5, 5), requires_grad=True)
>>> a = x + y
>>> a.requires_grad
False
>>> b = a + z
>>> b.requires_grad
True

這個(gè)標(biāo)志特別有用,當(dāng)您想要凍結(jié)部分模型時(shí),或者您事先知道不會(huì)使用某些參數(shù)的梯度。

autograd是專門為了BP算法設(shè)計(jì)的,所以這autograd只對(duì)輸出值為標(biāo)量的有用,因?yàn)閾p失函數(shù)的輸出是一個(gè)標(biāo)量。如果y是一個(gè)向量,那么backward()函數(shù)就會(huì)失效。

model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
  param.requires_grad = False
# Replace the last fully-connected layer
# Parameters of newly constructed modules have requires_grad=True by default
model.fc = nn.Linear(512, 100)

# Optimize only the classifier
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

上面的optim.SGD()只需要傳入需要優(yōu)化的參數(shù)即可。

volatile

純粹的inference模式(可以理解為只需要進(jìn)行前向)下推薦使用volatile,當(dāng)你確定你甚至不會(huì)調(diào)用.backward()時(shí)。它比任何其他自動(dòng)求導(dǎo)的設(shè)置更有效——它將使用絕對(duì)最小的內(nèi)存來(lái)評(píng)估模型。volatile也決定了require_grad is False。

volatile不同于require_grad的傳遞。如果一個(gè)操作甚至只有有一個(gè)volatile的輸入,它的輸出也將是volatile。Volatility比“不需要梯度”更容易傳遞——只需要一個(gè)volatile的輸入即可得到一個(gè)volatile的輸出,相對(duì)的,需要所有的輸入“不需要梯度”才能得到不需要梯度的輸出。使用volatile標(biāo)志,您不需要更改模型參數(shù)的任何設(shè)置來(lái)用于inference。創(chuàng)建一個(gè)volatile的輸入就夠了,這將保證不會(huì)保存中間狀態(tài)。

>>> regular_input = Variable(torch.randn(5, 5))
>>> volatile_input = Variable(torch.randn(5, 5), volatile=True)
>>> model = torchvision.models.resnet18(pretrained=True)
>>> model(regular_input).requires_grad
True
>>> model(volatile_input).requires_grad
False
>>> model(volatile_input).volatile
True
>>> model(volatile_input).creator is None
True

自動(dòng)求導(dǎo)如何編碼歷史信息

每個(gè)變量都有一個(gè).creator屬性,它指向把它作為輸出的函數(shù)。這是一個(gè)由Function對(duì)象作為節(jié)點(diǎn)組成的有向無(wú)環(huán)圖(DAG)的入口點(diǎn),它們之間的引用就是圖的邊。每次執(zhí)行一個(gè)操作時(shí),一個(gè)表示它的新Function就被實(shí)例化,它的forward()方法被調(diào)用,并且它輸出的Variable的創(chuàng)建者被設(shè)置為這個(gè)Function。然后,通過(guò)跟蹤從任何變量到葉節(jié)點(diǎn)的路徑,可以重建創(chuàng)建數(shù)據(jù)的操作序列,并自動(dòng)計(jì)算梯度。

variable和function它們是彼此不分開(kāi)的,先上圖:

如圖,假設(shè)我們有一個(gè)輸入變量input(數(shù)據(jù)類型為Variable)input是用戶輸入的,所以其創(chuàng)造者creator為null值,input經(jīng)過(guò)第一個(gè)數(shù)據(jù)操作operation1(比如加減乘除運(yùn)算)得到output1變量(數(shù)據(jù)類型仍為Variable),這個(gè)過(guò)程中會(huì)自動(dòng)生成一個(gè)function1的變量(數(shù)據(jù)類型為Function的一個(gè)實(shí)例),而output1的創(chuàng)造者就是這個(gè)function1。隨后,output1再經(jīng)過(guò)一個(gè)數(shù)據(jù)操作生成output2,這個(gè)過(guò)程也會(huì)生成另外一個(gè)實(shí)例function2,output2的創(chuàng)造者creator為function2。

在這個(gè)向前傳播的過(guò)程中,function1和function2記錄了數(shù)據(jù)input的所有操作歷史,當(dāng)output2運(yùn)行其backward函數(shù)時(shí),會(huì)使得function2和function1自動(dòng)反向計(jì)算input的導(dǎo)數(shù)值并存儲(chǔ)在grad屬性中。

creator為null的變量才能被返回導(dǎo)數(shù),比如input,若把整個(gè)操作流看成是一張圖(Graph),那么像input這種creator為null的被稱之為圖的葉子(graph leaf)。而creator非null的變量比如output1和output2,是不能被返回導(dǎo)數(shù)的,它們的grad均為0。所以只有葉子節(jié)點(diǎn)才能被autograd。

>>> from torch.autograd import Variable
>>> import torch
>>> x = Variable(torch.ones(2), requires_grad = >>> True)
>>> z=4*x*x
>>> y=z.norm()
>>> y
Variable containing:
 5.6569
[torch.FloatTensor of size 1]
>>> y.backward()
>>> x.grad
Variable containing:
 5.6569
 5.6569
[torch.FloatTensor of size 2]
>>> z.grad

>>> y.grad

Variable上的In-place操作

in-place計(jì)算,類似'+='運(yùn)算,表示內(nèi)部直接替換,in-place操作都使用_作為后綴。例如,x.copy_(y)

>>> a = torch.Tensor(3,4)
>>> a
 0 0 0 0
 0 0 0 0
 0 0 0 0
[torch.FloatTensor of size 3x4]
>>> a.fill_(2.5)  
 2.5000 2.5000 2.5000 2.5000
 2.5000 2.5000 2.5000 2.5000
 2.5000 2.5000 2.5000 2.5000
[torch.FloatTensor of size 3x4]
>>> b = a.add(4.0) 
>>> b
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
[torch.FloatTensor of size 3x4]
>>> a
 2.5000 2.5000 2.5000 2.5000
 2.5000 2.5000 2.5000 2.5000
 2.5000 2.5000 2.5000 2.5000
[torch.FloatTensor of size 3x4]
>>> c = a.add_(4.0) 
>>> c
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
[torch.FloatTensor of size 3x4]
>>> a
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
 6.5000 6.5000 6.5000 6.5000
[torch.FloatTensor of size 3x4]

在自動(dòng)求導(dǎo)中支持in-place操作是一件很困難的事情,我們?cè)诖蠖鄶?shù)情況下都不鼓勵(lì)使用它們。Autograd的緩沖區(qū)釋放和重用非常高效,并且很少場(chǎng)合下in-place操作能實(shí)際上明顯降低內(nèi)存的使用量。除非您在內(nèi)存壓力很大的情況下,否則您可能永遠(yuǎn)不需要使用它們。

限制in-place操作適用性主要有兩個(gè)原因:

1.覆蓋梯度計(jì)算所需的值。這就是為什么變量不支持log_。它的梯度公式需要原始輸入,而雖然通過(guò)計(jì)算反向操作可以重新創(chuàng)建它,但在數(shù)值上是不穩(wěn)定的,并且需要額外的工作,這往往會(huì)與使用這些功能的目的相悖。

2.每個(gè)in-place操作實(shí)際上需要實(shí)現(xiàn)重寫計(jì)算圖。不合適的版本只需分配新對(duì)象并保留對(duì)舊圖的引用,而in-place操作則需要將所有輸入的creator更改為表示此操作的Function。這就比較棘手,特別是如果有許多變量引用相同的存儲(chǔ)(例如通過(guò)索引或轉(zhuǎn)置創(chuàng)建的),并且如果被修改輸入的存儲(chǔ)被任何其他Variable引用,則in-place函數(shù)實(shí)際上會(huì)拋出錯(cuò)誤。

In-place正確性檢查

每個(gè)變量保留有version counter,它每次都會(huì)遞增,當(dāng)在任何操作中被使用時(shí)。當(dāng)Function保存任何用于后向的tensor時(shí),還會(huì)保存其包含變量的version counter。一旦訪問(wèn)self.saved_tensors,它將被檢查,如果它大于保存的值,則會(huì)引起錯(cuò)誤。

以上這篇關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python驗(yàn)證碼識(shí)別教程之灰度處理、二值化、降噪與tesserocr識(shí)別

    python驗(yàn)證碼識(shí)別教程之灰度處理、二值化、降噪與tesserocr識(shí)別

    這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識(shí)別教程之灰度處理、二值化、降噪與tesserocr識(shí)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • 基于PyQt5實(shí)現(xiàn)圖轉(zhuǎn)文功能(示例代碼)

    基于PyQt5實(shí)現(xiàn)圖轉(zhuǎn)文功能(示例代碼)

    PyQt提供了一個(gè)設(shè)計(jì)良好的窗口控件集合,具有更方便的操作性。學(xué)過(guò)VB的同學(xué)會(huì)知道,相比與VB的使用,在界面設(shè)計(jì)上元素更豐富,這篇文章主要介紹了基于PyQt5完成的圖轉(zhuǎn)文功能,需要的朋友可以參考下
    2022-06-06
  • Python利用pynimate實(shí)現(xiàn)制作動(dòng)態(tài)排序圖

    Python利用pynimate實(shí)現(xiàn)制作動(dòng)態(tài)排序圖

    這篇文章主要為大家詳細(xì)介紹了Python如何利用pynimate實(shí)現(xiàn)制作動(dòng)態(tài)排序圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • 用python爬取電腦壁紙實(shí)例代碼

    用python爬取電腦壁紙實(shí)例代碼

    大家好,本篇文章主要講的是用python爬取電腦壁紙實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Python解決“argument?after?*?must?be?an?iterable”報(bào)錯(cuò)問(wèn)題

    Python解決“argument?after?*?must?be?an?iterable”報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了Python解決“argument?after?*?must?be?an?iterable”報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • python爬蟲之百度API調(diào)用方法

    python爬蟲之百度API調(diào)用方法

    下面小編就為大家?guī)?lái)一篇python爬蟲之百度API調(diào)用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python在線編譯器的簡(jiǎn)單原理及簡(jiǎn)單實(shí)現(xiàn)代碼

    python在線編譯器的簡(jiǎn)單原理及簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要介紹了python在線編譯器的簡(jiǎn)單原理及簡(jiǎn)單實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Python 比較兩個(gè)數(shù)組的元素的異同方法

    Python 比較兩個(gè)數(shù)組的元素的異同方法

    下面小編就為大家?guī)?lái)一篇Python 比較兩個(gè)數(shù)組的元素的異同方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Python異步與定時(shí)任務(wù)提高程序并發(fā)性和定時(shí)執(zhí)行效率

    Python異步與定時(shí)任務(wù)提高程序并發(fā)性和定時(shí)執(zhí)行效率

    Python異步與定時(shí)任務(wù)是Python編程中常用的兩種技術(shù),異步任務(wù)可用于高效處理I/O密集型任務(wù),提高程序并發(fā)性;定時(shí)任務(wù)可用于定時(shí)執(zhí)行計(jì)劃任務(wù),提高程序的執(zhí)行效率。這兩種技術(shù)的應(yīng)用有助于提升Python程序的性能和效率
    2023-05-05
  • Python中元組的概念及應(yīng)用小結(jié)

    Python中元組的概念及應(yīng)用小結(jié)

    Python中的元組和列表很相似,元組也是Python語(yǔ)言提供的內(nèi)置數(shù)據(jù)結(jié)構(gòu)之一,可以在代碼中直接使用,這篇文章主要介紹了Python中元組的概念以及應(yīng)用,需要的朋友可以參考下
    2023-01-01

最新評(píng)論