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

pytorch中retain_graph==True的作用說(shuō)明

 更新時(shí)間:2023年02月21日 08:45:56   作者:撒旦即可  
這篇文章主要介紹了pytorch中retain_graph==True的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

pytorch retain_graph==True的作用說(shuō)明

總的來(lái)說(shuō)進(jìn)行一次backward之后,各個(gè)節(jié)點(diǎn)的值會(huì)清除,這樣進(jìn)行第二次backward會(huì)報(bào)錯(cuò),如果加上retain_graph==True后,可以再來(lái)一次backward。 

retain_graph參數(shù)的作用

官方定義:

retain_graph (bool, optional) – If False, the graph used to compute the grad will be freed. Note that in nearly all cases setting this option to True is not needed and often can be worked around in a much more efficient way. Defaults to the value of create_graph.

大意是如果設(shè)置為False,計(jì)算圖中的中間變量在計(jì)算完后就會(huì)被釋放。

但是在平時(shí)的使用中這個(gè)參數(shù)默認(rèn)都為False從而提高效率,和creat_graph的值一樣。

具體看一個(gè)例子理解

假設(shè)一個(gè)我們有一個(gè)輸入x,y = x **2, z = y*4,然后我們有兩個(gè)輸出,一個(gè)output_1 = z.mean(),另一個(gè)output_2 = z.sum()。

然后我們對(duì)兩個(gè)output執(zhí)行backward。

import torch
x = torch.randn((1,4),dtype=torch.float32,requires_grad=True)
y = x ** 2
z = y * 4
print(x)
print(y)
print(z)
loss1 = z.mean()
loss2 = z.sum()
print(loss1,loss2)
loss1.backward() ? ?# 這個(gè)代碼執(zhí)行正常,但是執(zhí)行完中間變量都free了,所以下一個(gè)出現(xiàn)了問(wèn)題
print(loss1,loss2)
loss2.backward() ? ?# 這時(shí)會(huì)引發(fā)錯(cuò)誤

程序正常執(zhí)行到第12行,所有的變量正常保存。

但是在第13行報(bào)錯(cuò):

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.

分析:計(jì)算節(jié)點(diǎn)數(shù)值保存了,但是計(jì)算圖x-y-z結(jié)構(gòu)被釋放了,而計(jì)算loss2的backward仍然試圖利用x-y-z的結(jié)構(gòu),因此會(huì)報(bào)錯(cuò)。

因此需要retain_graph參數(shù)為T(mén)rue去保留中間參數(shù)從而兩個(gè)loss的backward()不會(huì)相互影響。

正確的代碼應(yīng)當(dāng)把第11行以及之后改成

  • 1 # 假如你需要執(zhí)行兩次backward,先執(zhí)行第一個(gè)的backward,再執(zhí)行第二個(gè)backward
  • 2 loss1.backward(retain_graph=True)# 這里參數(shù)表明保留backward后的中間參數(shù)。
  • 3 loss2.backward() # 執(zhí)行完這個(gè)后,所有中間變量都會(huì)被釋放,以便下一次的循環(huán)
  • 4  #如果是在訓(xùn)練網(wǎng)絡(luò)optimizer.step() # 更新參數(shù)

create_graph參數(shù)比較簡(jiǎn)單,參考官方定義:

create_graph (bool, optional) – If True, graph of the derivative will be constructed, allowing to compute higher order derivative products. Defaults to False.

Pytorch retain_graph=True錯(cuò)誤信息

(Pytorch:RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time)

具有多個(gè)loss值

retain_graph設(shè)置True,一般多用于兩次backward

# 假如有兩個(gè)Loss,先執(zhí)行第一個(gè)的backward,再執(zhí)行第二個(gè)backward
loss1.backward(retain_graph=True) # 這樣計(jì)算圖就不會(huì)立即釋放
loss2.backward() # 執(zhí)行完這個(gè)后,所有中間變量都會(huì)被釋放,以便下一次的循環(huán)
optimizer.step() # 更新參數(shù)

retain_graph設(shè)置True后一定要知道釋放,否則顯卡會(huì)占用越來(lái)越多,代碼速度也會(huì)跑的越來(lái)越慢。

有的時(shí)候我明明僅有一個(gè)模型的也會(huì)出現(xiàn)這種錯(cuò)誤

第一種是輸入的原因。

// Example
x = torch.randn((100,1), requires_grad = True)
y = 1 + 2 * x + 0.3 * torch.randn(100,1)
x_train, y_train = x[:70], y[:70]
x_val, y_val = x[70:], y[70:]

for epoch in range(n_epochs):
?? ?...
?? ?prediction = model(x_train)
?? ?loss.backward()
?? ?...

在多次循環(huán)的過(guò)程中,input的梯度沒(méi)有清除,而且我們也不需要計(jì)算輸入的梯度,因此將x的require_grad設(shè)置為False就可以解決問(wèn)題。

第二種是我在訓(xùn)練LSTM時(shí)候發(fā)現(xiàn)的。

class LSTMpred(nn.Module):
? ? def __init__(self, input_size, hidden_dim):
? ? ?? ?self.hidden = self.init_hidden()
? ? ? ?...
? ? def init_hidden(self):?? ?#這里我們是需要個(gè)隱層參數(shù)的
? ? ? ? return (torch.zeros(1, 1, self.hidden_dim, requires_grad=True),
? ? ? ? ? ? ? ? torch.zeros(1, 1, self.hidden_dim, requires_grad=True))
? ? def forward(self, seq):
? ? ? ? ...

這里面的self.hidden我們?cè)诿恳淮斡?xùn)練的時(shí)候都要重新初始化隱層參數(shù):

for epoch in range(Epoch):
?? ?...
?? ?model.hidden = model.init_hidden()
?? ?modout = model(seq)
? ? ...

3. 我的看法

其實(shí),想想這幾種情況都是一回事,都是網(wǎng)絡(luò)在反向傳播中不允許多個(gè)backward(),也就是梯度下降反饋的時(shí)候,有多個(gè)循環(huán)過(guò)程中共用了同一個(gè)需要計(jì)算梯度的變量,在前一個(gè)循環(huán)清除梯度后,后面一個(gè)循環(huán)過(guò)程就會(huì)在這個(gè)變量上栽跟頭(個(gè)人想法)。

總結(jié)

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

相關(guān)文章

  • K-近鄰算法的python實(shí)現(xiàn)代碼分享

    K-近鄰算法的python實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了K-近鄰算法的python實(shí)現(xiàn)代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • python制作爬蟲(chóng)爬取京東商品評(píng)論教程

    python制作爬蟲(chóng)爬取京東商品評(píng)論教程

    本文是繼前2篇Python爬蟲(chóng)系列文章的后續(xù)篇,給大家介紹的是如何使用Python爬取京東商品評(píng)論信息的方法,并根據(jù)數(shù)據(jù)繪制成各種統(tǒng)計(jì)圖表,非常的細(xì)致,有需要的小伙伴可以參考下
    2016-12-12
  • Python庫(kù)textract提取各種文檔類(lèi)型中文本數(shù)據(jù)

    Python庫(kù)textract提取各種文檔類(lèi)型中文本數(shù)據(jù)

    Python的textract庫(kù)是一個(gè)強(qiáng)大的工具,它可以從各種文檔類(lèi)型中提取文本數(shù)據(jù),無(wú)論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來(lái),本文將詳細(xì)介紹textract的功能和用法,并提供豐富的示例代碼來(lái)幫助大家深入了解
    2024-01-01
  • python zip文件 壓縮

    python zip文件 壓縮

    看了我前面的一系列文章,不知道你會(huì)不會(huì)覺(jué)得python是無(wú)所不能的,我現(xiàn)在就這感覺(jué)!如何用python進(jìn)行文件壓縮呢
    2008-12-12
  • 一文詳解Python中的Map,Filter和Reduce函數(shù)

    一文詳解Python中的Map,Filter和Reduce函數(shù)

    這篇文章主要介紹了一文詳解Python中的Map,Filter和Reduce函數(shù),本文重點(diǎn)介紹Python中的三個(gè)特殊函數(shù)Map,Filter和Reduce,以及如何使用它們進(jìn)行代碼編程
    2022-08-08
  • Python實(shí)現(xiàn)爬蟲(chóng)IP負(fù)載均衡和高可用集群的示例代碼

    Python實(shí)現(xiàn)爬蟲(chóng)IP負(fù)載均衡和高可用集群的示例代碼

    做大型爬蟲(chóng)項(xiàng)目經(jīng)常遇到請(qǐng)求頻率過(guò)高的問(wèn)題,這里需要說(shuō)的是使用爬蟲(chóng)IP可以提高抓取效率,本文主要介紹了Python實(shí)現(xiàn)爬蟲(chóng)IP負(fù)載均衡和高可用集群的示例代碼,感興趣的可以了解一下
    2023-12-12
  • python實(shí)現(xiàn)吃蘋(píng)果小游戲

    python實(shí)現(xiàn)吃蘋(píng)果小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)吃蘋(píng)果小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python3壓縮和解壓文件案例總結(jié)

    python3壓縮和解壓文件案例總結(jié)

    壓縮和解壓縮是日常常用的操作,不管是windows上圖形界面的操作,還是linux上用命令來(lái)進(jìn)行壓縮解壓縮,總的而言都還是比較方便的,本文通過(guò)案例代碼講解了python3壓縮和解壓文件的方法,
    2023-02-02
  • Python Pandas處理csv文件常用示例

    Python Pandas處理csv文件常用示例

    Pandas是一個(gè)非常強(qiáng)大的數(shù)據(jù)操作python包,支持各種數(shù)據(jù)格式,包括CSV文件,本文就來(lái)介紹一下Python Pandas處理csv文件常用示例,感興趣的可以了解一下
    2023-12-12
  • python實(shí)現(xiàn)plt x軸坐標(biāo)按1刻度顯示

    python實(shí)現(xiàn)plt x軸坐標(biāo)按1刻度顯示

    這篇文章主要介紹了python實(shí)現(xiàn)plt x軸坐標(biāo)按1刻度顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評(píng)論

北流市| 南阳市| 昌吉市| 龙南县| 礼泉县| 青海省| 泉州市| 伊金霍洛旗| 荔波县| 湟中县| 师宗县| 渝中区| 龙州县| 琼海市| 云和县| 玉环县| 三江| 镇雄县| 梧州市| 昆明市| 古丈县| 宾川县| 丹阳市| 綦江县| 鄂托克前旗| 宣武区| 上饶市| 永平县| 育儿| 遂平县| 浮山县| 佛冈县| 扬中市| 石渠县| 二连浩特市| 张掖市| 仙居县| 临清市| 道孚县| 嘉峪关市| 抚顺市|