in-place operation在pytorch中是指改變一個tensor的值的時候,不經過複製操作,而是直接在原來的內存上改變它的值。可以把它成為原地操作符。
在pytorch中經常加後綴“_”來代表原地in-place operation,比如說.add_() 或者.scatter()。python裡面的+=,*=也是in-place operation。
下面是正常的加操作,執行結束加操作之後x的值沒有發生變化:
import torch x=torch.rand(2) #tensor([0.8284, 0.5539]) print(x) y=torch.rand(2) print(x+y) #tensor([1.0250, 0.7891]) print(x) #tensor([0.8284, 0.5539])
下面是原地操作,執行之後改變了原來變量的值:
import torch x=torch.rand(2) #tensor([0.8284, 0.5539]) print(x) y=torch.rand(2) x.add_(y) print(x) #tensor([1.1610, 1.3789])
在官方問文檔中由這一段話:
如果你使用了in-place operation而沒有報錯的話,那麼你可以確定你的梯度計算是正確的。
補充知識:PyTorch中nn.ReLU(inplace=True)中inplace的作用
我們用PyTorch搭建神經網絡時,會遇到nn.ReLU(inplace=True),inplace=True是什麼意思呢?
nn.Conv2d(64,192,kernel_size=3,stride=1,padding=1),
nn.ReLu(inpalce=True),# inplace為True,默認為False
意思是:是否將計算得到的值直接覆蓋之前的值
例如:x = x+1
即對原值x進行+1操作後得到的值,直接賦值給x
而不是如下找一箇中間變量y:
y=x+1
x=y
先將x進行+1操作後賦值給中間變量y,然後將y值賦給x
這樣就需要內存存儲變量y
因此當inplace=True時:
就是對從上層網絡nn.Conv2d中傳遞下來的tensor直接進行修改,這樣能夠節省運算內存,不用多存儲其他變量。
[qp18502452 ] 淺談PyTorch中in-place operation的含義_python已經有257次圍觀