如何在PyTorch中執行就地操作?


就地操作直接更改張量的內容,無需複製。因為它不建立輸入的副本,所以在處理高維資料時可以減少記憶體使用。就地操作有助於減少GPU記憶體的使用。

在PyTorch中,就地操作總是字尾為"_",例如add_()、mul_()等。

步驟

要執行就地操作,可以按照以下步驟進行:

  • 匯入所需的庫。所需的庫是torch。

  • 定義/建立要執行就地操作的張量。

  • 執行普通就地操作,以檢視它們之間的區別。

  • 顯示在普通和就地操作中獲得的張量。

示例1

下面的Python程式突出了普通加法和就地加法之間的區別。在就地加法中,第一個運算元“x”的值會改變;而在普通加法中,它保持不變。

# import required library
import torch

# create two tensors x and y
x = torch.tensor(4)
y = torch.tensor(3)
print("x=", x.item())
print("y=", y.item())

# Normal addition
z = x.add(y)
print("Normal Addition x:",x.item())

# In-place addition
z = x.add_(y)
print("In-place Addition x:",x.item())

輸出

x = 4
y = 3
Normal Addition x: 4
In-place Addition x: 7

在上面的程式中,兩個張量x和y相加。在普通加法運算中,x的值不變,但在就地加法運算中,它的值改變了。

示例2

下面的Python程式顯示了普通加法和就地加法運算在記憶體分配方面的區別。

# import required library
import torch

# create two tensors x and y
x = torch.tensor(4)
y = torch.tensor(3)
print("id(x)=", id(x))

# Normal addition
z = x.add(y)
print("Normal Addition id(z):",id(z))

# In-place addition
z = x.add_(y)
print("In-place Addition id(z):",id(z))

輸出

id(x)= 63366656
Normal Addition id(z): 63366080
In-place Addition id(z): 63366656

在上面的程式中,普通操作為“z”分配新的記憶體位置,而就地操作則不會分配新的記憶體。

更新於:2021年12月6日

1K+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告