PyTorch常用的张量创建、变形及运算总结(速查表)
PyTorch張量常用的創(chuàng)建、變形及數(shù)學(xué)運(yùn)算總結(jié)
目錄
- PyTorch張量常用的創(chuàng)建、變形及數(shù)學(xué)運(yùn)算總結(jié)
- 1. 張量(tensor)的創(chuàng)建
- 1.1 torch.Tensor()與torch.tensor()
- 1.2 torch.rand(), torch.ones(), torch.zeros()
- 1.3 torch.FloatTensor()、torch.DouleTensor()、torch.cuda.FloatTebsor()等
- 2 基礎(chǔ)運(yùn)算或變換
- 2.1 size()函數(shù)或shape屬性獲取張量尺寸
- 2.2 變形(view()、transpose()、flatten())
- 2.3 加減乘除(+、-、*、\0)及矩陣乘法(@/matnul)
- 2.3 張量的拆分、連接、拼接與維度變化(split/chunk、cat、stack、sequeeze、unsequeeze)
1. 張量(tensor)的創(chuàng)建
1.1 torch.Tensor()與torch.tensor()
torch.Tensor(3,2)返回一個(gè)尺寸為3*2的未初始化的張量
torch.Tensor(data)返回一個(gè)torch.FloatTensor類型的data
torch.tensor(3, 2)報(bào)錯(cuò),tensor函數(shù)參數(shù)必須為一個(gè)基本數(shù)據(jù)類型或引用數(shù)據(jù)類型數(shù)據(jù)如整型、浮點(diǎn)型或列表
torch.tensor(data)返回一個(gè)給定數(shù)值的張量
區(qū)別:
- torch.Tensor()是一個(gè)python類,擁有很多可以對(duì)數(shù)據(jù)加以處理的方法,而torch.tensor()是一個(gè)函數(shù)
- torc.tensor()的參數(shù)只能是data而不能是size
- torch.Tensor()相當(dāng)于torch.FloatTensor()的別名,返回單精度浮點(diǎn)型張量。torch.tensor()自動(dòng)拷貝傳入的數(shù)據(jù),在沒有給dtype參數(shù)時(shí),返回torch.FloatTensor、torch.DoubleTensor、torch.LongTensor三種數(shù)據(jù)類型張量。給定dtype時(shí)返回指定dtype。
PyTorch官方文檔對(duì)torch.tensor()函數(shù)的解釋如下
示例代碼:
data1 = torch.Tensor([2, 3]) data2 = torch.Tensor(2, 3) data3 = torch.tensor([2, 3]) print(data1) print(data2) print(data3)# 運(yùn)行結(jié)果 tensor([2., 3.]) tensor([[0., 0., 0.],[0., 0., 0.]]) tensor([2, 3])1.2 torch.rand(), torch.ones(), torch.zeros()
rand()函數(shù)用于創(chuàng)建一個(gè)指定尺寸的隨機(jī)矩陣
ones()函數(shù)用于創(chuàng)建一個(gè)指定尺寸的元素全為1的矩陣
zeros()函數(shù)用于創(chuàng)建一個(gè)指定尺寸的元素全為0的矩陣
示例代碼
1.3 torch.FloatTensor()、torch.DouleTensor()、torch.cuda.FloatTebsor()等
以下表格列出了PyTorch支持的數(shù)據(jù)類型及其創(chuàng)建函數(shù)
| 32位浮點(diǎn)型 | torch.FloatTensor | torch.cuda.FloatTensor |
| 64位浮點(diǎn)型 | torch.DouleTensor | torch.cuda.FloatTensor |
| 16位浮點(diǎn)型 | torch.HalfTensor | torch.cuda.HalfTensor |
| 8位整型(無符號(hào)) | torch.ByteTensor | torch.cuda.ByteTensor |
| 8位整型(有符號(hào)) | torch.CharTensor | torch.cuda.CharTensor |
| 16位整型(有符號(hào)) | torch.ShortTensor | torch.cuda.ShortTensor |
| 32位整型(有符號(hào)) | torch.IntTensor | torch.cuda.IntTensor |
| 64位整型(有符號(hào)) | torch.LongTensor | torch.cuda.LongTensor |
2 基礎(chǔ)運(yùn)算或變換
2.1 size()函數(shù)或shape屬性獲取張量尺寸
為了PyTorch API更加接近于NumpyAPI 以取得近似于Numpy數(shù)據(jù)處理包的強(qiáng)大功能,PyTorch在0.2版本后引入shape屬性,用戶不但可以像以前一樣通過size()函數(shù)獲取張量尺寸,也可以通過shape屬性直接獲取。
示例代碼:
2.2 變形(view()、transpose()、flatten())
有時(shí)我們需要對(duì)已有張量進(jìn)行一些變形,比如,三維張量平展成一維張量, 或者交換矩陣的某兩個(gè)維度(轉(zhuǎn)置)
- view()函數(shù)可對(duì)原張量進(jìn)行任意形式的變形(前提是張量的參數(shù)個(gè)數(shù)保持不變)
- transpose()函數(shù)可對(duì)原張量任意兩個(gè)維度進(jìn)行轉(zhuǎn)置(交換)
- flatten()函數(shù)可以指定任意連續(xù)維度進(jìn)行“平鋪”
示例代碼
import torchdata1 = torch.rand(2, 3, 4, 5) data2 = data1.view(2, 4, 3, 5) data3 = data1.view(-1) # -1 讓python自己計(jì)算張量長(zhǎng)度,按照整體長(zhǎng)度不變的原則進(jìn)行填充 data4 = data1.view(-1, 10)print(data1[0, :, :, 0]) # 輸出第2,3維張量 print(data2[0, :, :, 0]) print(data3.size()) print(data4.size())data5 = data1.transpose(1, 2) print(data5[0, :, :, 0]) print(data2.size()) print(data5.size())# 運(yùn)行結(jié)果 tensor([[0.6149, 0.0561, 0.6514, 0.8010],[0.4063, 0.5112, 0.1584, 0.5826],[0.0581, 0.5838, 0.8439, 0.1180]]) tensor([[0.6149, 0.0561, 0.6514],[0.8010, 0.4063, 0.5112],[0.1584, 0.5826, 0.0581],[0.5838, 0.8439, 0.1180]]) torch.Size([120]) torch.Size([12, 10]) tensor([[0.6149, 0.4063, 0.0581],[0.0561, 0.5112, 0.5838],[0.6514, 0.1584, 0.8439],[0.8010, 0.5826, 0.1180]]) torch.Size([2, 4, 3, 5]) torch.Size([2, 4, 3, 5])# flatten data1 = torch.rand(2, 3, 4, 5) data2 = data1.flatten(1) data3 = data1.flatten(1, 2) print(data2.size()) print(data3.size()) # 運(yùn)行結(jié)果: torch.Size([2, 60]) torch.Size([2, 12, 5])可以發(fā)現(xiàn),view()的變形是將原張量按順序填入新的尺寸張量,這容易改變?cè)瓘埩康臄?shù)學(xué)意義。transpose()有點(diǎn)類似于“轉(zhuǎn)置”,一定程度上保留了原張量的數(shù)學(xué)意義。
此外,注意到view(2, 4, 3, 5)最后和transpose(1, 2)取得了同樣的維度結(jié)果,但是兩者的數(shù)值結(jié)果是完全不一樣的,原因正如第一點(diǎn)所述。
2.3 加減乘除(+、-、*、\0)及矩陣乘法(@/matnul)
示例代碼:
data10 = data6 + 5 data11 = data10 - 3 data12 = data10 * data11 data13 = torch.tensor([[1.],[1.]]) data14 = data12 @ data13 # 注意* 和 @ 的區(qū)別 data15 = data12.matmul(data13) print(data10) print(data11) print(data12) print(data14) # 運(yùn)行結(jié)果 tensor([[5., 5.],[5., 5.],[5., 5.]]) tensor([[2., 2.],[2., 2.],[2., 2.]]) tensor([[10., 10.],[10., 10.],[10., 10.]]) tensor([[20.],[20.],[20.]]) tensor([[20.],[20.],[20.]])2.3 張量的拆分、連接、拼接與維度變化(split/chunk、cat、stack、sequeeze、unsequeeze)
示例代碼:
import torchdata1 = torch.rand(3, 2) # 拆分 data2 = data1.split(1, 0) # 返回一個(gè)張量元組 print("data1: ", data1) print("data2: ", data2) print("data2[0]: ", data2[0])# 連接 data3 = torch.ones(1, 2) data4 = torch.cat((data1, data3), 0) print("data3: ", data3) print("data4: ", data4)# 拼接 data5 = torch.ones(3, 2) data6 = torch.stack((data1, data5), 0) print("data5: ", data5) print("data6: ", data6)data7 = data1.unsqueeze(0) print("data7: ", data7) print("data1.size: ", data1.size()) print("data7.size: ", data7.size())data8 = data7.squeeze() print("data8.size: ", data8.shape)# 運(yùn)行結(jié)果 data1: tensor([[0.3280, 0.8911],[0.4691, 0.9570],[0.5510, 0.6604]]) data2: (tensor([[0.3280, 0.8911]]), tensor([[0.4691, 0.9570]]), tensor([[0.5510, 0.6604]])) data2[0]: tensor([[0.3280, 0.8911]]) data3: tensor([[1., 1.]]) data4: tensor([[0.3280, 0.8911],[0.4691, 0.9570],[0.5510, 0.6604],[1.0000, 1.0000]]) data5: tensor([[1., 1.],[1., 1.],[1., 1.]]) data6: tensor([[[0.3280, 0.8911],[0.4691, 0.9570],[0.5510, 0.6604]],[[1.0000, 1.0000],[1.0000, 1.0000],[1.0000, 1.0000]]]) data7: tensor([[[0.3280, 0.8911],[0.4691, 0.9570],[0.5510, 0.6604]]]) data1.size: torch.Size([3, 2]) data7.size: torch.Size([1, 3, 2]) data8.size: torch.Size([3, 2])總結(jié)
以上是生活随笔為你收集整理的PyTorch常用的张量创建、变形及运算总结(速查表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动手深度学习——Pytorch 入门语法
- 下一篇: 代码之髓读后感