1. 程式人生 > 實用技巧 >Pytorch中的張量複製

Pytorch中的張量複製

pytorch提供了clone、detach、copy_和new_tensor等多種張量的複製操作,尤其前兩者在深度學習的網路架構中經常被使用,本文旨在對比這些操作的差別。

1. clone

返回一個和源張量同shape、dtype和device的張量,與源張量不共享資料記憶體,但提供梯度的回溯。

clone後的返回值是個中間variable,因此支援梯度的回溯。因此,clone操作在一定程度上可以視為是一個identity-mapping函式。

clone作為一箇中間variable,會將梯度傳給源張量進行疊加。

但若源張量的require_grad=False,而clone後的張量require_grad=True

,顯然此時不存在張量回溯現象,clone後的張量可以求導。

綜上論述,clone操作在不共享資料記憶體的同時支援梯度回溯,所以常用在神經網路中某個單元需要重複使用的場景下。

2. detach

detach的機制則與clone完全不同,即返回一個和源張量同shapedtypedevice的張量,與源張量共享資料記憶體,但不提供梯度計算,即requires_grad=False,因此脫離計算圖。

detach後的張量,即使重新定義requires_grad=True,也與源張量的梯度沒有關係。

綜上論述,detach操作在共享資料記憶體的脫離計算圖,所以常用在神經網路中僅要利用張量數值,而不需要追蹤導數的場景下。

3. clone和detach聯合使用

clone提供了非資料共享的梯度追溯功能,而detach又“捨棄”了梯度功能,因此clone和detach聯合使用意味著著只做簡單的資料複製,既不資料共享,也不對梯度共享,從此兩個張量無關聯

置於是先clone還是先detach,其返回值一樣,一般採用tensor.clone().detach()。

4. new_tensor

new_tensor可以將源張量中的資料複製到目標張量(資料不共享),同時提供了更細緻的devicedtyperequires_grad屬性控制:

其預設引數下的操作等同於.clone().detach()

,而requires_grad=True時的效果相當於.clone().detach()requires_grad_(True)。上面兩種情況都推薦使用後者。

5. copy_

copy_同樣將源張量中的資料複製到目標張量(資料不共享),其devicedtyperequires_grad一般都保留目標張量的設定,僅僅進行資料複製,同時其支援broadcast操作。

具體試驗參考:

【Pytorch】對比clone、detach以及copy_等張量複製操作

Pytorch張量(Tensor)複製