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

Pytorch中關(guān)于inplace的操作

 更新時間:2023年08月02日 16:13:44   作者:二十米  
這篇文章主要介紹了Pytorch中關(guān)于inplace的操作方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Pytorch中inplace操作

之前在寫訓(xùn)練代碼時,遇到了inplace operation導(dǎo)致的問題,所以就了解了一下pytorch的inplace operation,記錄一下inplace操作的知識。

報錯信息如下:

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation.

Inplace操作概述

稍微了解過python的人應(yīng)該會知道python的變量名是一個類似索引的東西,其指向內(nèi)存中的一個對象。

而對該變量重新賦值,實際上是將該變量名指向內(nèi)存中的其它對象,原對象本身其實并未改變。而Inplace操作并非如此,該操作會直接改變原對象的內(nèi)容,這樣能減少內(nèi)存的消耗,但也會帶來一些隱患。

非inplace操作如下圖所示,運(yùn)算操作先是開辟了一塊新的內(nèi)存存放運(yùn)算后的結(jié)果,然后再將引用指向新內(nèi)存,而舊內(nèi)存的內(nèi)容保持不變。

而inplace操作則不同,運(yùn)算操作會直接在舊內(nèi)存上進(jìn)行更改,而并不會另外開辟一個新內(nèi)存進(jìn)行運(yùn)算結(jié)果的存放。

inplace操作的優(yōu)缺點

要使用好inplace操作,首先肯定需要知道其存在的優(yōu)點以及缺點。根據(jù)inplace操作的原理,其實不難發(fā)現(xiàn)其優(yōu)點就在于節(jié)省內(nèi)存,尤其是在處理高維數(shù)據(jù)時能顯著減少額外的內(nèi)存開銷,這在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時是很有價值的一個特性。

但在節(jié)省內(nèi)存的同時,inplace操作也帶來了一些隱患,pytorch的官方文檔是這樣說的:

  • inplace操作可能會覆蓋計算梯度所需的值。
  • 每個inplace操作實際上都需要實現(xiàn)重寫計算圖。Out-of-place版本只是簡單地分配新對象并保持對舊圖的引用,而inplace操作則要求將所有輸入的創(chuàng)建者更改為表示該操作的函數(shù)。

也就是說,在Autograd中支持inplace操作很困難,有時候會在不經(jīng)意間導(dǎo)致自動求導(dǎo)失敗,得到上文所提到的報錯。同時,Autograd積極的緩沖區(qū)釋放和重用使其非常高效,inplace操作實際上并不能降低太多內(nèi)存的消耗,因此在大多數(shù)情況下不鼓勵使用。除非在沉重的內(nèi)存壓力下運(yùn)行,否則可能永遠(yuǎn)不需要使用inplace操作。

PS:如果你使用了inplace操作而沒有報錯的話,那么你可以確定你的梯度計算是正確的。但是,這僅僅表示Autograd計算梯度無誤,如果出現(xiàn)了該內(nèi)存被其他變量引用而未注意,依舊可能存在計算一致性的風(fēng)險。

常見的inplace操作

inplace操作有優(yōu)點也有缺點,但總體來說還是弊大于利,所以如果顯存足夠的話,還是盡量少用inplace操作。那inplace操作有哪些呢?

  • 1.數(shù)值運(yùn)算,如x+=1屬于inplace操作,會直接對x的值進(jìn)行操作;而y=x+5則不屬于inplace操作(PS:x+=1雖然是inplace操作,但求導(dǎo)時其導(dǎo)數(shù)為1,導(dǎo)數(shù)值并不與x的值相關(guān),所以不會對反向傳播產(chǎn)生影響,故這種情況的影響不大)
  • 2.pytorch提供的一些inplace選項,如nn.ReLU(inplace=True)、nn.LeakyReLU(inplace=True),這些選項的安全性要高一些,但也需要注意中間變量后續(xù)是否需要,如果后面還需要使用中間變量,就應(yīng)當(dāng)設(shè)置inplace=False
  • 3.具有 _ 后綴的方法,如x.copy_(y),x.t_(),將直接改變x。同時,一些常見的操作如x.add_(y)x.mul_(y)也會直接改變x,除非有特定需求,否則不建議使用這類inplace操作,隱患比前兩種情況高很多。

以上是常見的一些inplace操作,雖然不建議使用inplace操作,但還是需要了解一下,以免日后遇到問題。

注意:

inplace操作會直接修改原內(nèi)存處的值,雖然會節(jié)省一些內(nèi)存,但也會帶來一些隱患,如自動求導(dǎo)出錯等。因此如果不是內(nèi)存十分緊缺,不建議使用inplace操作。

pytorch的inplace的問題

最近將一個模型訓(xùn)練代碼從caffe平臺移植到pytorch平臺過程中遇到了一個詭異的inplace坑,特別記錄一下防止大家掉坑。

relu等激活函數(shù)的inplace

看到官方的relu入?yún)⑹侵衝n.ReLU(inplace=True)是inplace操作,我一想這不是能節(jié)省我的資源占用,毫不猶豫的選擇了True。

搭好模型運(yùn)行,結(jié)果是在backward計算導(dǎo)數(shù)的時候。表示inplace操作導(dǎo)致求導(dǎo)結(jié)果有問題。

改為**nn.ReLU(inplace=False)**問題在pytorch1.3和pytorch1.8解決了。

“+=”操作的默認(rèn)inplace

后來因為換了pytorch1.10版本后又報錯了。報錯形式和上面一樣。

后來查了一下“+=”也是inplace操作,將工程中網(wǎng)絡(luò)的前向傳播方式中:x += feature16改為:“x = x + feature16” 。

問題就消失了。

報錯形式

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.HalfTensor [×,×,×,×]], which is output 0 of ReluBackward0, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

總結(jié)

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

相關(guān)文章

  • Python簡明入門教程

    Python簡明入門教程

    這篇文章主要介紹了Python簡明入門教程,較為詳細(xì)的分析了Python的基本概念及語法基礎(chǔ),有助于Python初學(xué)者更好的掌握Python的基本語法與使用技巧,需要的朋友可以參考下
    2015-08-08
  • matplotlib簡介,安裝和簡單實例代碼

    matplotlib簡介,安裝和簡單實例代碼

    這篇文章主要介紹了matplotlib簡介,安裝和簡單實例代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Python之site-packages目錄的位置

    Python之site-packages目錄的位置

    這篇文章主要介紹了Python之site-packages目錄的位置,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • python實現(xiàn)敲木魚加功德包含加音效和敲擊動作(附demo)

    python實現(xiàn)敲木魚加功德包含加音效和敲擊動作(附demo)

    敲木魚加功德是一款很火的動畫,本文主要介紹了python實現(xiàn)敲木魚加功德包含加音效和敲擊動作,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • python+opencv+caffe+攝像頭做目標(biāo)檢測的實例代碼

    python+opencv+caffe+攝像頭做目標(biāo)檢測的實例代碼

    今天小編就為大家分享一篇python+opencv+caffe+攝像頭做目標(biāo)檢測的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Python打造智能批量重命名工具的詳細(xì)指南

    Python打造智能批量重命名工具的詳細(xì)指南

    因辦公要求,經(jīng)常需要對眾多、各類文件(夾)進(jìn)行重命名,人數(shù)少還好說,人數(shù)大就是一個稍微復(fù)雜的問題了,所以本文我們就來使用Python開發(fā)一個智能批量重命名工具吧
    2025-07-07
  • Python常用標(biāo)準(zhǔn)庫之os模塊功能

    Python常用標(biāo)準(zhǔn)庫之os模塊功能

    這篇文章主要介紹了Python常用標(biāo)準(zhǔn)庫之os模塊功能,os模塊的主要功能有系統(tǒng)相關(guān)、目錄及文件操作、執(zhí)行命令和管理進(jìn)程,其中的進(jìn)程管理功能主要是Linux相關(guān)的,此處不做討論,對Python標(biāo)準(zhǔn)庫os相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Pyspider中給爬蟲偽造隨機(jī)請求頭的實例

    Pyspider中給爬蟲偽造隨機(jī)請求頭的實例

    今天小編就為大家分享一篇Pyspider中給爬蟲偽造隨機(jī)請求頭的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Tensorflow: 從checkpoint文件中讀取tensor方式

    Tensorflow: 從checkpoint文件中讀取tensor方式

    今天小編就為大家分享一篇Tensorflow: 從checkpoint文件中讀取tensor方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python DNS查詢放大攻擊實現(xiàn)原理解析

    Python DNS查詢放大攻擊實現(xiàn)原理解析

    這篇文章主要介紹了Python DNS查詢放大攻擊實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10

最新評論

嘉善县| 封开县| 荆门市| 扎鲁特旗| 苗栗市| 四川省| 华容县| 丰顺县| 左权县| 闽清县| 临洮县| 前郭尔| 岚皋县| 新乡县| 高尔夫| 丹寨县| 秦皇岛市| 伊吾县| 丘北县| 青阳县| 深州市| 阳西县| 滦南县| 久治县| 茶陵县| 贞丰县| 方城县| 疏附县| 巫溪县| 紫阳县| 云霄县| 周口市| 朝阳市| 铜鼓县| 巨野县| 古田县| 康平县| 武鸣县| 饶阳县| 德州市| 宁河县|