Pytorch有关张量的各种操作
一,創(chuàng)建張量
1. 生成float格式的張量:
a = torch.tensor([1,2,3],dtype = torch.float)2. 生成從1到10,間隔是2的張量:
b = torch.arange(1,10,step = 2)3. 隨機(jī)生成從0.0到6.28的10個(gè)張量
注意:
(1).生成的10個(gè)張量中包含0.0和6.28(兩端點(diǎn))
(2).生成的張量步長(zhǎng)是隨機(jī)的
4. zeros_like是生成與a格式相同,但是是全0且格式是float的張量
a = torch.ones((3,3),dtype = torch.int) b = torch.zeros_like(a,dtype = torch.float)5. 將b中為0或NULL元素替換成5
torch.fill_(b,5)6. 均勻隨機(jī)分布:torch.manual_seed(0)為CPU中設(shè)置種子,生成隨機(jī)數(shù)
torch.manual_seed(0) minval,maxval = 0,10 a = minval + (maxval-minval)*torch.rand([5])7. 正態(tài)分布隨機(jī)
均值means是一個(gè)張量,包含每個(gè)輸出元素相關(guān)的正態(tài)分布的均值。
std是一個(gè)張量,包含每個(gè)輸出元素相關(guān)的正態(tài)分布的標(biāo)準(zhǔn)差。
均值和標(biāo)準(zhǔn)差的形狀不須匹配,但每個(gè)張量的元素個(gè)數(shù)須相同。
8. 正態(tài)分布隨機(jī)
mean,std = 2,5 c = std*torch.randn((3,3))+mean9. 整數(shù)隨機(jī)排列
d = torch.randperm(20)10. 生成特殊矩陣
I = torch.eye(3,3) #單位矩陣 t = torch.diag(torch.tensor([1,2,3])) #對(duì)角矩陣二,索引切片
張量的索引切片方式和numpy幾乎是一樣的。切片時(shí)支持缺省參數(shù)和省略號(hào)。
1.切片第1行至第3行
print(t[1:4,:])2.切片第1行至最后一行,第0列到最后一列每隔兩列取一列
print(t[1:4,:4:2])3.可以使用索引和切片修改部分元素
x = torch.tensor([[1,2],[3,4]],dtype = torch.float32,requires_grad=True) x.data[1,:] = torch.tensor([0.0,0.0])4.對(duì)于不規(guī)則的切片提取
可以使用torch.index_select, torch.take, torch.gather, torch.masked_select.
take將輸入看成一維數(shù)組,輸出和index同形狀
5.通過修改張量的部分元素值得到新的張量
torch.where可以理解為if的張量版本。
torch.index_fill的選取元素邏輯和torch.index_select相同。
torch.masked_fill的選取元素邏輯和torch.masked_select相同。
三,維度變換相關(guān)函數(shù)
維度變換相關(guān)函數(shù)主要有 torch.reshape(或者調(diào)用張量的view方法),torch.squeeze,torch.unsqueeze, torch.transpose
torch.reshape 可以改變張量的形狀。
torch.squeeze 可以減少維度。
torch.unsqueeze 可以增加維度。
torch.transpose 可以交換維度。
1. 改成 (3,6)形狀的張量
b = a.view([3,6]) #torch.reshape(a,[3,6])2. 改回成 [1,3,3,2] 形狀的張量
c = torch.reshape(b,[1,3,3,2]) # b.view([1,3,3,2])3. torch.squeeze消除維度。
如果張量在某個(gè)維度上只有一個(gè)元素,利用torch.squeeze可以消除這個(gè)維度。
s = torch.squeeze(a)4. torch.unsqueeze
torch.unsqueeze的作用和torch.squeeze的作用相反,增加維度。
#在第0維插入長(zhǎng)度為1的一個(gè)維度 d = torch.unsqueeze(s,axis=0)5.轉(zhuǎn)換成 Pytorch默認(rèn)的圖片格式
torch.transpose可以交換張量的維度,torch.transpose常用于圖片存儲(chǔ)格式的變換上。
如果是二維的矩陣,通常會(huì)調(diào)用矩陣的轉(zhuǎn)置方法 matrix.t(),等價(jià)于 torch.transpose(matrix,0,1)。
四,合并分割
可以用torch.cat方法和torch.stack方法將多個(gè)張量合并,可以用torch.split方法把一個(gè)張量分割成多個(gè)張量。
1.torch.cat和torch.stack
torch.cat和torch.stack有略微的區(qū)別,torch.cat是連接,不會(huì)增加維度,而torch.stack是堆疊,會(huì)增加維度。
abc_cat = torch.cat([a,b,c],dim = 0) abc_stack = torch.stack([a,b,c],axis = 0) #torch中dim和axis參數(shù)名可以混用,=0時(shí)是按照行連接,=1列連接 torch.cat([a,b,c],axis = 1)2.torch.split
torch.split是torch.cat的逆運(yùn)算,可以指定分割份數(shù)平均分割,也可以通過指定每份的記錄數(shù)量進(jìn)行分割。
a,b,c = torch.split(abc_cat,split_size_or_sections = 2,dim = 0) #每份2個(gè)進(jìn)行分割 p,q,r = torch.split(abc_cat,split_size_or_sections =[4,1,1],dim = 0) #每份分別為[4,1,1]五,張量數(shù)學(xué)計(jì)算
1.取整
print(torch.round(x)) #保留整數(shù)部分,四舍五入 print(torch.floor(x)) #保留整數(shù)部分,向下歸整 print(torch.ceil(x)) #保留整數(shù)部分,向上歸整 print(torch.trunc(x)) #保留整數(shù)部分,向0歸整2.除法余數(shù)
print(torch.fmod(x,2)) #作除法取余數(shù) print(torch.remainder(x,2)) #作除法取剩余的部分,結(jié)果恒正3.幅值裁剪
x = torch.tensor([0.9,-0.8,100.0,-20.0,0.7]) y = torch.clamp(x,min=-1,max = 1) z = torch.clamp(x,max = 1)4.累乘,標(biāo)準(zhǔn)差,方差,中位數(shù)
print(torch.prod(a)) #累乘 print(torch.std(a)) #標(biāo)準(zhǔn)差 print(torch.var(a)) #方差 print(torch.median(a)) #中位數(shù)5.張量排序
torch.sort和torch.topk可以對(duì)張量排序
print(torch.topk(a,2,dim = 1),"\n") #沿給定dim維度返回輸入張量input中 k 個(gè)最大值。 print(torch.sort(a,dim = 1),"\n")六,矩陣運(yùn)算
1.矩陣乘法
print(a@b) #等價(jià)于torch.matmul(a,b) 或 torch.mm(a,b)2.矩陣轉(zhuǎn)置
print(a.t())3.矩陣逆,必須為浮點(diǎn)類型
print(torch.inverse(a))4.矩陣求trace
print(torch.trace(a))5.矩陣求范數(shù)
print(torch.norm(a))6.矩陣行列式
print(torch.det(a))7.矩陣特征值和特征向量
print(torch.eig(a,eigenvectors=True))8.矩陣QR分解
矩陣QR分解, 將一個(gè)方陣分解為一個(gè)正交矩陣q和上三角矩陣r
QR分解實(shí)際上是對(duì)矩陣a實(shí)施Schmidt正交化得到q
9.矩陣svd分解
svd分解可以將任意一個(gè)矩陣分解為一個(gè)正交矩陣u,一個(gè)對(duì)角陣s和一個(gè)正交矩陣v.t()的乘積
svd常用于矩陣壓縮和降維
七,廣播機(jī)制
torch.broadcast_tensors
torch.broadcast_tensors可以將多個(gè)張量根據(jù)廣播規(guī)則轉(zhuǎn)換成相同的維度。
a_broad,b_broad = torch.broadcast_tensors(a,b) #轉(zhuǎn)換成相同的維度總結(jié)
以上是生活随笔為你收集整理的Pytorch有关张量的各种操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到白猫是胎梦吗
- 下一篇: nn.functional 和 nn.M