PyTorch使用教程之Tensor包詳解
1、張量Tensor
張量(Tensor)是PyTorch深度學習框架中的核心數據結構,在PyTorch軟件框架中,幾乎所有的數據計算和信息流都是以Tensor的形式在表達。官方給出的定義是:
一個 torch.Tensor是一個包含單個數據類型元素的多維矩陣
關鍵詞
- 單個數據類型:在一個張量數據結構內,只會包含一種數據類型。
- 多維矩陣:簡單來說張量就是為了高維矩陣而創(chuàng)建的,常用的NCHW格式矩陣,就是4維矩陣。
學習Tensor這個包的時候,主要是關注張量的數據類型、張量的一些基本操作。
2、數據類型
為了支持各種精度的訓練、推理,Tensor支持的數據類型繁多。這里,僅列出在做計算機視覺相關的常用數據類型。
數據類型 | dtype |
---|---|
32 位浮點數 | torch.float32 或 torch.float |
64 位浮點數 | torch.float64 或 torch.double |
16 位浮點數1 | torch.float16 或 torch.half |
16 位浮點數 2 | torch.bfloat16 |
8 位整數(無符號) | torch.uint8 |
32 位整數(無符號) | torch.uint32 |
8 位整數(帶符號) | torch.int8 |
32 位整數(帶符號) | torch.int32 或 torch.int |
布爾值 | torch.bool |
量化 8 位整數(無符號) | torch.quint8 |
量化 8 位整數(帶符號) | ttorch.qint8 |
量化 32 位整數(帶符號) | torch.qint32 |
量化 4 位整數(無符號) | torch.quint4x2 |
要構造張量,建議使用工廠函數,例如 torch.empty(),其中使用 dtype 參數。 torch.Tensor 構造函數是默認張量類型 (torch.FloatTensor) 的別名。也就是說,在構造張量時,不傳入數據類型參數,默認就是32位浮點數。
3、初始化(構造張量)
可以使用 torch.tensor() 構造函數從 Python list 或序列構造張量。
>>> torch.tensor([[1., -1.], [1., -1.]]) tensor([[ 1.0000, -1.0000], [ 1.0000, -1.0000]]) >>> torch.tensor(np.array([[1, 2, 3], [4, 5, 6]])) tensor([[ 1, 2, 3], [ 4, 5, 6]])
有幾個注意點:
- torch.tensor() 始終復制 data。也就是說使用list或者序列構造張量時,均為以深拷貝的方式創(chuàng)建。
- 可以通過將 torch.dtype 和/或 torch.device 傳遞給構造函數或張量創(chuàng)建操作來構造特定數據類型的張量。例如:
>>> torch.zeros([2, 4], dtype=torch.int32) tensor([[ 0, 0, 0, 0], [ 0, 0, 0, 0]], dtype=torch.int32) >>> cuda0 = torch.device('cuda:0') >>> torch.ones([2, 4], dtype=torch.float64, device=cuda0) tensor([[ 1.0000, 1.0000, 1.0000, 1.0000], [ 1.0000, 1.0000, 1.0000, 1.0000]], dtype=torch.float64, device='cuda:0')
更多的張量構造方式可以參考我的上一篇博文《PyTorch使用教程(2)-torch包》。
4、常用操作
張量支持索引、切片、連接、修改等操作,也支持大量的數學計算操作。常見的操作可以參考我的上一篇博文《PyTorch使用教程(2)-torch包》。這里,僅講述張量操作需注意的幾個點。
僅對一個單個值的張量的使用進行說明:
使用 torch.Tensor.item() 從包含單個值的張量中獲取 Python 數字。
>>> x = torch.tensor([[1]]) >>> x tensor([[ 1]]) >>> x.item() 1 >>> x = torch.tensor(2.5) >>> x tensor(2.5000) >>> x.item() 2.5
操作張量的方法如果用下劃線后綴標記,則表示該操作時inplace操作:操作后的張量和輸入張量共享一個Storage。使用inplace操作,可以減小GPU緩存的使用。如torch.FloatTensor.abs_() 在原地計算絕對值并返回修改后的張量,而 torch.FloatTensor.abs() 在新張量中計算結果。
>>> x = torch.tensor([[1., -1.], [1., -1.]]) >>> x2=x.abs_() >>> x.storage <bound method Tensor.storage of tensor([[1., 1.], [1., 1.]])> >>> x2.storage <bound method Tensor.storage of tensor([[1., 1.], [1., 1.]])>
5、常用屬性
5.1 存儲(storage)
每個張量都與一個關聯的 torch.Storage,它保存其數據,可以理解為數據緩地址。
>>> t = torch.rand((2,2)) >>> t.storage <bound method Tensor.storage of tensor([[0.3267, 0.8759], [0.9612, 0.1931]])>
5.2 形狀(shape)
可以使用shape屬性或者size()方法查看張量在每一維的長度。
>>> x = torch.randn((3,3)) >>> x.shape torch.Size([3, 3]) >>> x.size() torch.Size([3, 3])
可以通過torch的reshape方法或者張量本身的View()方法進行形狀的改變。
>>> t = torch.rand((3, 3)) >>> t tensor([[0.8397, 0.6708, 0.8727], [0.8286, 0.3910, 0.9540], [0.8672, 0.4297, 0.1825]]) >>> m=t.view(1,9) >>> m tensor([[0.8397, 0.6708, 0.8727, 0.8286, 0.3910, 0.9540, 0.8672, 0.4297, 0.1825]])
5.3 數據類型(dtype)
張量的數據類型(如torch.float32, torch.int64等)。
>>> t = torch.rand((3, 3)) >>> t.dtype torch.float32
5.4 設備(device)
張量所在的設備(如CPU或GPU)。
>>> m = torch.rand((3, 3)) >>> m.device device(type='cpu')
如需要在CPU和GPU之間進行張量的移動,可以使用張量的to()方法。
將張量移動到GPU(如果可用)。
>>> m=torch.rand((2,2)) >>> m.device device(type='cpu') >>> m.to('cuda') tensor([[0.5340, 0.0079], [0.2983, 0.5315]], device='cuda:0')
將張量移動至CPU
>>> m.to('cpu') tensor([[0.5340, 0.0079], [0.2983, 0.5315]])
6、小結下
用一個表格,匯總下PyTorch中tensor(張量)的常用數據結構及其相關屬性:
屬性/方法 | 描述 | 示例代碼 |
---|---|---|
維度(Dimension) | 張量的維度,標量為0維,向量為1維,矩陣為2維,以此類推 | x = torch.tensor([[1, 2], [3, 4]]) (2維張量) |
形狀(Shape) | 張量在各維度上的大小,返回一個元組 | print(x.shape) 輸出: torch.Size([2, 2]) |
大?。⊿ize) | 張量中元素的總數,或各維度大小的元組(通過size() 方法) | print(x.size()) 輸出: torch.Size([2, 2]) ;print(x.numel()) 輸出: 4 |
數據類型(Dtype) | 張量中元素的數據類型 | x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32) ;print(x.dtype) 輸出: torch.float32 |
設備(Device) | 張量所在的設備(CPU或GPU) | x = x.to('cuda') (如果GPU可用);print(x.device) 輸出: cuda:0 (或類似的) |
是否要求梯度(Requires Grad) | 一個布爾值,指示是否需要對該張量進行梯度計算 | x.requires_grad_(True) ;print(x.requires_grad) 輸出: True |
梯度(Grad) | 如果requires_grad=True ,則存儲該張量的梯度 | y = x.sum() ;y.backward() ;print(x.grad) 輸出張量的梯度 |
數據(Data) | 張量中存儲的實際數據 | x = torch.tensor([[1, 2], [3, 4]]) ;print(x) 輸出張量的數據 |
索引與切片 | 使用整數、切片或布爾索引來訪問或修改張量的元素 | x[0, 1] 訪問第1行第2列的元素;x[:, 0] 訪問第1列的所有元素 |
視圖操作 | .view() 或.reshape() 改變張量的形狀,但不改變其數據 | x_reshaped = x.view(4) 或 x_reshaped = x.reshape(4) 將2x2張量變?yōu)?x4張量 |
數學運算 | 支持加法、減法、乘法、除法、冪運算等 | y = x + 2 ;z = x.pow(2) |
統計函數 | 如求和(.sum() )、均值(.mean() )、最大值(.max() )等 | sum_val = x.sum() ;mean_val = x.mean() |
類型轉換 | 轉換為其他數據類型或設備上的張量 | x_float64 = x.to(dtype=torch.float64) ;x_cpu = x.to('cpu') |
到此這篇關于PyTorch使用教程之Tensor包詳解的文章就介紹到這了,更多相關PyTorch Tensor包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python?dataframe獲得指定行列實戰(zhàn)代碼
對于一個DataFrame,常常需要篩選出某列為指定值的行,下面這篇文章主要給大家介紹了關于python?dataframe獲得指定行列的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12python 實現非極大值抑制算法(Non-maximum suppression, NMS)
這篇文章主要介紹了python 如何實現非極大值抑制算法(Non-maximum suppression, NMS),幫助大家更好的進行機器學習,感興趣的朋友可以了解下2020-10-10