PyTorch使用教程之Tensor包詳解

1、張量Tensor
張量(Tensor)是PyTorch深度學(xué)習(xí)框架中的核心數(shù)據(jù)結(jié)構(gòu),在PyTorch軟件框架中,幾乎所有的數(shù)據(jù)計(jì)算和信息流都是以Tensor的形式在表達(dá)。官方給出的定義是:
一個(gè) torch.Tensor是一個(gè)包含單個(gè)數(shù)據(jù)類(lèi)型元素的多維矩陣
關(guān)鍵詞
- 單個(gè)數(shù)據(jù)類(lèi)型:在一個(gè)張量數(shù)據(jù)結(jié)構(gòu)內(nèi),只會(huì)包含一種數(shù)據(jù)類(lèi)型。
- 多維矩陣:簡(jiǎn)單來(lái)說(shuō)張量就是為了高維矩陣而創(chuàng)建的,常用的NCHW格式矩陣,就是4維矩陣。
學(xué)習(xí)Tensor這個(gè)包的時(shí)候,主要是關(guān)注張量的數(shù)據(jù)類(lèi)型、張量的一些基本操作。
2、數(shù)據(jù)類(lèi)型
為了支持各種精度的訓(xùn)練、推理,Tensor支持的數(shù)據(jù)類(lèi)型繁多。這里,僅列出在做計(jì)算機(jī)視覺(jué)相關(guān)的常用數(shù)據(jù)類(lèi)型。
| 數(shù)據(jù)類(lèi)型 | dtype |
|---|---|
| 32 位浮點(diǎn)數(shù) | torch.float32 或 torch.float |
| 64 位浮點(diǎn)數(shù) | torch.float64 或 torch.double |
| 16 位浮點(diǎn)數(shù)1 | torch.float16 或 torch.half |
| 16 位浮點(diǎn)數(shù) 2 | torch.bfloat16 |
| 8 位整數(shù)(無(wú)符號(hào)) | torch.uint8 |
| 32 位整數(shù)(無(wú)符號(hào)) | torch.uint32 |
| 8 位整數(shù)(帶符號(hào)) | torch.int8 |
| 32 位整數(shù)(帶符號(hào)) | torch.int32 或 torch.int |
| 布爾值 | torch.bool |
| 量化 8 位整數(shù)(無(wú)符號(hào)) | torch.quint8 |
| 量化 8 位整數(shù)(帶符號(hào)) | ttorch.qint8 |
| 量化 32 位整數(shù)(帶符號(hào)) | torch.qint32 |
| 量化 4 位整數(shù)(無(wú)符號(hào)) | torch.quint4x2 |
要構(gòu)造張量,建議使用工廠(chǎng)函數(shù),例如 torch.empty(),其中使用 dtype 參數(shù)。 torch.Tensor 構(gòu)造函數(shù)是默認(rèn)張量類(lèi)型 (torch.FloatTensor) 的別名。也就是說(shuō),在構(gòu)造張量時(shí),不傳入數(shù)據(jù)類(lèi)型參數(shù),默認(rèn)就是32位浮點(diǎn)數(shù)。
3、初始化(構(gòu)造張量)
可以使用 torch.tensor() 構(gòu)造函數(shù)從 Python list 或序列構(gòu)造張量。
>>> 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]])有幾個(gè)注意點(diǎn):
- torch.tensor() 始終復(fù)制 data。也就是說(shuō)使用list或者序列構(gòu)造張量時(shí),均為以深拷貝的方式創(chuàng)建。
- 可以通過(guò)將 torch.dtype 和/或 torch.device 傳遞給構(gòu)造函數(shù)或張量創(chuàng)建操作來(lái)構(gòu)造特定數(shù)據(jù)類(lèi)型的張量。例如:
>>> 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')更多的張量構(gòu)造方式可以參考我的上一篇博文《PyTorch使用教程(2)-torch包》。
4、常用操作
張量支持索引、切片、連接、修改等操作,也支持大量的數(shù)學(xué)計(jì)算操作。常見(jiàn)的操作可以參考我的上一篇博文《PyTorch使用教程(2)-torch包》。這里,僅講述張量操作需注意的幾個(gè)點(diǎn)。
僅對(duì)一個(gè)單個(gè)值的張量的使用進(jìn)行說(shuō)明:
使用 torch.Tensor.item() 從包含單個(gè)值的張量中獲取 Python 數(shù)字。
>>> x = torch.tensor([[1]]) >>> x tensor([[ 1]]) >>> x.item() 1 >>> x = torch.tensor(2.5) >>> x tensor(2.5000) >>> x.item() 2.5
操作張量的方法如果用下劃線(xiàn)后綴標(biāo)記,則表示該操作時(shí)inplace操作:操作后的張量和輸入張量共享一個(gè)Storage。使用inplace操作,可以減小GPU緩存的使用。如torch.FloatTensor.abs_() 在原地計(jì)算絕對(duì)值并返回修改后的張量,而 torch.FloatTensor.abs() 在新張量中計(jì)算結(jié)果。
>>> 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 存儲(chǔ)(storage)
每個(gè)張量都與一個(gè)關(guān)聯(lián)的 torch.Storage,它保存其數(shù)據(jù),可以理解為數(shù)據(jù)緩地址。
>>> 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()方法查看張量在每一維的長(zhǎng)度。
>>> x = torch.randn((3,3)) >>> x.shape torch.Size([3, 3]) >>> x.size() torch.Size([3, 3])
可以通過(guò)torch的reshape方法或者張量本身的View()方法進(jìn)行形狀的改變。
>>> 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 數(shù)據(jù)類(lèi)型(dtype)
張量的數(shù)據(jù)類(lèi)型(如torch.float32, torch.int64等)。
>>> t = torch.rand((3, 3)) >>> t.dtype torch.float32
5.4 設(shè)備(device)
張量所在的設(shè)備(如CPU或GPU)。
>>> m = torch.rand((3, 3)) >>> m.device device(type='cpu')
如需要在CPU和GPU之間進(jìn)行張量的移動(dòng),可以使用張量的to()方法。
將張量移動(dòng)到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')將張量移動(dòng)至CPU
>>> m.to('cpu')
tensor([[0.5340, 0.0079],
[0.2983, 0.5315]])6、小結(jié)下
用一個(gè)表格,匯總下PyTorch中tensor(張量)的常用數(shù)據(jù)結(jié)構(gòu)及其相關(guān)屬性:
| 屬性/方法 | 描述 | 示例代碼 |
|---|---|---|
| 維度(Dimension) | 張量的維度,標(biāo)量為0維,向量為1維,矩陣為2維,以此類(lèi)推 | x = torch.tensor([[1, 2], [3, 4]]) (2維張量) |
| 形狀(Shape) | 張量在各維度上的大小,返回一個(gè)元組 | print(x.shape) 輸出: torch.Size([2, 2]) |
| 大?。⊿ize) | 張量中元素的總數(shù),或各維度大小的元組(通過(guò)size()方法) | print(x.size()) 輸出: torch.Size([2, 2]);print(x.numel()) 輸出: 4 |
| 數(shù)據(jù)類(lèi)型(Dtype) | 張量中元素的數(shù)據(jù)類(lèi)型 | x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32);print(x.dtype) 輸出: torch.float32 |
| 設(shè)備(Device) | 張量所在的設(shè)備(CPU或GPU) | x = x.to('cuda')(如果GPU可用);print(x.device) 輸出: cuda:0(或類(lèi)似的) |
| 是否要求梯度(Requires Grad) | 一個(gè)布爾值,指示是否需要對(duì)該張量進(jìn)行梯度計(jì)算 | x.requires_grad_(True);print(x.requires_grad) 輸出: True |
| 梯度(Grad) | 如果requires_grad=True,則存儲(chǔ)該張量的梯度 | y = x.sum();y.backward();print(x.grad) 輸出張量的梯度 |
| 數(shù)據(jù)(Data) | 張量中存儲(chǔ)的實(shí)際數(shù)據(jù) | x = torch.tensor([[1, 2], [3, 4]]);print(x) 輸出張量的數(shù)據(jù) |
| 索引與切片 | 使用整數(shù)、切片或布爾索引來(lái)訪(fǎng)問(wèn)或修改張量的元素 | x[0, 1] 訪(fǎng)問(wèn)第1行第2列的元素;x[:, 0] 訪(fǎng)問(wèn)第1列的所有元素 |
| 視圖操作 | .view()或.reshape()改變張量的形狀,但不改變其數(shù)據(jù) | x_reshaped = x.view(4) 或 x_reshaped = x.reshape(4) 將2x2張量變?yōu)?x4張量 |
| 數(shù)學(xué)運(yùn)算 | 支持加法、減法、乘法、除法、冪運(yùn)算等 | y = x + 2;z = x.pow(2) |
| 統(tǒng)計(jì)函數(shù) | 如求和(.sum())、均值(.mean())、最大值(.max())等 | sum_val = x.sum();mean_val = x.mean() |
| 類(lèi)型轉(zhuǎn)換 | 轉(zhuǎn)換為其他數(shù)據(jù)類(lèi)型或設(shè)備上的張量 | x_float64 = x.to(dtype=torch.float64);x_cpu = x.to('cpu') |
到此這篇關(guān)于PyTorch使用教程之Tensor包詳解的文章就介紹到這了,更多相關(guān)PyTorch Tensor包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用PyTorch/TensorFlow搭建簡(jiǎn)單全連接神經(jīng)網(wǎng)絡(luò)
- 最新tensorflow與pytorch環(huán)境搭建的實(shí)現(xiàn)步驟
- pytorch?tensor合并與分割方式
- Pytorch實(shí)現(xiàn)tensor序列化和并行化的示例詳解
- PyTorch?TensorFlow機(jī)器學(xué)習(xí)框架選擇實(shí)戰(zhàn)
- pytorch中tensorboard安裝及安裝過(guò)程中出現(xiàn)的常見(jiàn)錯(cuò)誤問(wèn)題
- Pytorch之tensorboard無(wú)法啟動(dòng)和顯示問(wèn)題及解決
- Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系解讀
- PyTorch中tensor[..., 2:4]的實(shí)現(xiàn)示例
相關(guān)文章
Python高級(jí)應(yīng)用實(shí)例對(duì)比:高效計(jì)算大文件中的最長(zhǎng)行的長(zhǎng)度
在操作某個(gè)很多進(jìn)程都要頻繁用到的大文件的時(shí)候,應(yīng)該盡早釋放文件資源(f.close()),只有這樣才能算是一則高效率的代碼,下面我們就來(lái)分析下這3種方法的優(yōu)劣2014-06-06
純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼
這篇文章主要介紹了純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python獲取list中最大或最小的n個(gè)數(shù)及其索引方式
文章介紹兩種獲取列表最大/最小值的方法:方法一通過(guò)深拷貝逐次定位并置零,適應(yīng)重復(fù)值場(chǎng)景;方法二利用heapq模塊,適用于無(wú)重復(fù)值情況,重復(fù)時(shí)需結(jié)合方法一,兩種方法各有優(yōu)劣,代碼示例展示不同場(chǎng)景下的實(shí)現(xiàn)效果2025-09-09
python中使用pyhook實(shí)現(xiàn)鍵盤(pán)監(jiān)控的例子
這篇文章主要介紹了python中使用pyhook實(shí)現(xiàn)鍵盤(pán)監(jiān)控的例子,包含pyhook的下載地址和手冊(cè)地址及一個(gè)Windows下的監(jiān)控實(shí)例,需要的朋友可以參考下2014-07-07
Python中print函數(shù)語(yǔ)法格式以及各參數(shù)舉例詳解
這篇文章主要給大家介紹了關(guān)于Python中print函數(shù)語(yǔ)法格式以及各參數(shù)舉例詳解的相關(guān)資料,print()函數(shù)用于將指定的字符串或?qū)ο?通常是字符串)輸出到屏幕或文件中,需要的朋友可以參考下2023-10-10

