日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pytorch有关张量的各种操作

發布時間:2023/11/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch有关张量的各种操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,創建張量

1. 生成float格式的張量:

a = torch.tensor([1,2,3],dtype = torch.float)

2. 生成從1到10,間隔是2的張量:

b = torch.arange(1,10,step = 2)

3. 隨機生成從0.0到6.28的10個張量

注意:
(1).生成的10個張量中包含0.0和6.28(兩端點)
(2).生成的張量步長是隨機的

c = torch.linspace(0.0,2*3.14,10)

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. 均勻隨機分布:torch.manual_seed(0)為CPU中設置種子,生成隨機數

torch.manual_seed(0) minval,maxval = 0,10 a = minval + (maxval-minval)*torch.rand([5])

7. 正態分布隨機

均值means是一個張量,包含每個輸出元素相關的正態分布的均值。
std是一個張量,包含每個輸出元素相關的正態分布的標準差。
均值和標準差的形狀不須匹配,但每個張量的元素個數須相同。

b = torch.normal(mean = torch.zeros(3,3), std = torch.ones(3,3))

8. 正態分布隨機

mean,std = 2,5 c = std*torch.randn((3,3))+mean

9. 整數隨機排列

d = torch.randperm(20)

10. 生成特殊矩陣

I = torch.eye(3,3) #單位矩陣 t = torch.diag(torch.tensor([1,2,3])) #對角矩陣

二,索引切片

張量的索引切片方式和numpy幾乎是一樣的。切片時支持缺省參數和省略號。

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.對于不規則的切片提取

可以使用torch.index_select, torch.take, torch.gather, torch.masked_select.

  • 抽取每個班級第0個學生,第5個學生,第9個學生的全部成績
  • torch.index_select(scores,dim = 1,index = torch.tensor([0,5,9]))
  • 抽取每個班級第0個學生,第5個學生,第9個學生的第1門課程,第3門課程,第6門課程成績
  • q = torch.index_select(torch.index_select(scores,dim = 1,index = torch.tensor([0,5,9])),dim=2,index = torch.tensor([1,3,6]))
  • 抽取第0個班級第0個學生的第0門課程,第2個班級的第4個學生的第1門課程,第3個班級的第9個學生第6門課程成績
    take將輸入看成一維數組,輸出和index同形狀
  • s = torch.take(scores,torch.tensor([0*10*7+0,2*10*7+4*7+1,3*10*7+9*7+6])) #感覺跟數組序列號一樣
  • 抽取分數大于等于80分的分數(布爾索引),結果是1維張量
  • g = torch.masked_select(scores,scores>=80)

    5.通過修改張量的部分元素值得到新的張量

    torch.where可以理解為if的張量版本。
    torch.index_fill的選取元素邏輯和torch.index_select相同。
    torch.masked_fill的選取元素邏輯和torch.masked_select相同。

  • 如果分數大于60分,賦值成1,否則賦值成0
  • ifpass = torch.where(scores>60,torch.tensor(1),torch.tensor(0))
  • 將每個班級第0個學生,第5個學生,第9個學生的全部成績賦值成滿分
  • torch.index_fill(scores,dim = 1,index = torch.tensor([0,5,9]),value = 100) #等價于 scores.index_fill(dim = 1,index = torch.tensor([0,5,9]),value = 100)
  • 將分數小于60分的分數賦值成60分
  • b = torch.masked_fill(scores,scores<60,60) #等價于b = scores.masked_fill(scores<60,60)

    三,維度變換相關函數

    維度變換相關函數主要有 torch.reshape(或者調用張量的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消除維度。

    如果張量在某個維度上只有一個元素,利用torch.squeeze可以消除這個維度。

    s = torch.squeeze(a)

    4. torch.unsqueeze

    torch.unsqueeze的作用和torch.squeeze的作用相反,增加維度。

    #在第0維插入長度為1的一個維度 d = torch.unsqueeze(s,axis=0)

    5.轉換成 Pytorch默認的圖片格式

    torch.transpose可以交換張量的維度,torch.transpose常用于圖片存儲格式的變換上。
    如果是二維的矩陣,通常會調用矩陣的轉置方法 matrix.t(),等價于 torch.transpose(matrix,0,1)。

    # 轉換成 Pytorch默認的圖片格式 Batch,Channel,Height,Width # 需要交換兩次 data_t = torch.transpose(torch.transpose(data,1,2),1,3)print(matrix.t()) #等價于torch.transpose(matrix,0,1)

    四,合并分割

    可以用torch.cat方法和torch.stack方法將多個張量合并,可以用torch.split方法把一個張量分割成多個張量。

    1.torch.cat和torch.stack

    torch.cat和torch.stack有略微的區別,torch.cat是連接,不會增加維度,而torch.stack是堆疊,會增加維度。

    abc_cat = torch.cat([a,b,c],dim = 0) abc_stack = torch.stack([a,b,c],axis = 0) #torch中dim和axis參數名可以混用,=0時是按照行連接,=1列連接 torch.cat([a,b,c],axis = 1)

    2.torch.split

    torch.split是torch.cat的逆運算,可以指定分割份數平均分割,也可以通過指定每份的記錄數量進行分割。

    a,b,c = torch.split(abc_cat,split_size_or_sections = 2,dim = 0) #每份2個進行分割 p,q,r = torch.split(abc_cat,split_size_or_sections =[4,1,1],dim = 0) #每份分別為[4,1,1]

    五,張量數學計算

    1.取整

    print(torch.round(x)) #保留整數部分,四舍五入 print(torch.floor(x)) #保留整數部分,向下歸整 print(torch.ceil(x)) #保留整數部分,向上歸整 print(torch.trunc(x)) #保留整數部分,向0歸整

    2.除法余數

    print(torch.fmod(x,2)) #作除法取余數 print(torch.remainder(x,2)) #作除法取剩余的部分,結果恒正

    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.累乘,標準差,方差,中位數

    print(torch.prod(a)) #累乘 print(torch.std(a)) #標準差 print(torch.var(a)) #方差 print(torch.median(a)) #中位數

    5.張量排序

    torch.sort和torch.topk可以對張量排序

    print(torch.topk(a,2,dim = 1),"\n") #沿給定dim維度返回輸入張量input中 k 個最大值。 print(torch.sort(a,dim = 1),"\n")

    六,矩陣運算

    1.矩陣乘法

    print(a@b) #等價于torch.matmul(a,b) 或 torch.mm(a,b)

    2.矩陣轉置

    print(a.t())

    3.矩陣逆,必須為浮點類型

    print(torch.inverse(a))

    4.矩陣求trace

    print(torch.trace(a))

    5.矩陣求范數

    print(torch.norm(a))

    6.矩陣行列式

    print(torch.det(a))

    7.矩陣特征值和特征向量

    print(torch.eig(a,eigenvectors=True))

    8.矩陣QR分解

    矩陣QR分解, 將一個方陣分解為一個正交矩陣q和上三角矩陣r
    QR分解實際上是對矩陣a實施Schmidt正交化得到q

    q,r = torch.qr(a) print(q@r)#還原a

    9.矩陣svd分解

    svd分解可以將任意一個矩陣分解為一個正交矩陣u,一個對角陣s和一個正交矩陣v.t()的乘積
    svd常用于矩陣壓縮和降維

    u,s,v = torch.svd(a) print(u@torch.diag(s)@v.t()) #還原a

    七,廣播機制

    torch.broadcast_tensors

    torch.broadcast_tensors可以將多個張量根據廣播規則轉換成相同的維度。

    a_broad,b_broad = torch.broadcast_tensors(a,b) #轉換成相同的維度

    總結

    以上是生活随笔為你收集整理的Pytorch有关张量的各种操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。