快捷方式

張量檢視

PyTorch 允許張量成為現有張量的 View(檢視)。檢視張量與其基礎張量共享底層資料。支援 View 可避免顯式資料複製,從而使我們能夠快速且高效地進行重塑、切片和逐元素操作。

例如,要獲取現有張量 t 的檢視,可以呼叫 t.view(...)

>>> t = torch.rand(4, 4)
>>> b = t.view(2, 8)
>>> t.storage().data_ptr() == b.storage().data_ptr()  # `t` and `b` share the same underlying data.
True
# Modifying view tensor changes base tensor as well.
>>> b[0][0] = 3.14
>>> t[0][0]
tensor(3.14)

由於檢視與基礎張量共享底層資料,如果在檢視中編輯資料,更改也會反映在基礎張量中。

通常,PyTorch 操作會返回一個新的張量作為輸出,例如 add()。但在檢視操作的情況下,輸出是輸入張量的檢視,以避免不必要的資料複製。建立檢視時不會發生資料移動,檢視張量只是改變了解釋相同資料的方式。對連續張量建立檢視可能會產生非連續張量。由於連續性可能對效能產生隱式影響,使用者應額外注意。transpose() 是一個常見的示例。

>>> base = torch.tensor([[0, 1],[2, 3]])
>>> base.is_contiguous()
True
>>> t = base.transpose(0, 1)  # `t` is a view of `base`. No data movement happened here.
# View tensors might be non-contiguous.
>>> t.is_contiguous()
False
# To get a contiguous tensor, call `.contiguous()` to enforce
# copying data when `t` is not contiguous.
>>> c = t.contiguous()

以下是 PyTorch 中檢視操作的完整列表供參考:

注意

當透過索引訪問張量內容時,PyTorch 遵循 Numpy 的行為:基本索引返回檢視,而高階索引返回副本。無論是透過基本索引還是高階索引進行的賦值都是原地操作。更多示例請參閱 Numpy 索引文件

此外,還有一些具有特殊行為的操作值得一提:

  • reshape()reshape_as()flatten() 可能會返回檢視或新張量,使用者程式碼不應依賴於其是否為檢視。

  • 如果輸入張量已連續,contiguous() 返回其本身,否則透過複製資料返回一個新的連續張量。

有關 PyTorch 內部實現的更詳細介紹,請參閱 ezyang 關於 PyTorch Internals 的部落格文章

文件

查閱 PyTorch 的全面開發者文件

檢視文件

教程

獲取適合初學者和高階開發者的深度教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源