pytorch 花式張量 Tensor 操作

2022-08-09 02:30:17 字數 4481 閱讀 5385

一、張量的維度操作

1.squezee & unsqueeze

x = torch.rand(5,1,2,1)

x = torch.squeeze(x)#x.squeeze()

去掉大小為1的維度,x.shape =(5,2)

x = torch.unsqueeze(x,2)#x.unsqueeze(2)

和squeeze相反在第三維上擴充套件,x.shape = (5,2,1)

2.張量擴散,在指定維度上將原來的張量擴充套件到指定大小,比如原來x是31,輸入size為[3, 4],可以將其擴大成34,4為原來1個元素的複製

x = x.expand(*size)

x = x.expand_as(y)# y:[3,4

3.轉置,torch.transpose 只能交換兩個維度 permute沒有限制

x = torch.transpose(x, 1, 2) #

交換1和2維度

x = x.permute(1, 2, 3, 0) #

進行維度重組

4.改變形狀,view&reshape 兩者作用一樣,區別在於是當從多的維度變到少的維度時,如果張量不是在連續記憶體存放,則view無法變成合併維度,會報錯

x = x.view(1, 2, -1)#

把原先tensor中的資料按照行優先的順序排成乙個一維的資料(這裡應該是因為要求位址是連續儲存的),然後按照引數組合成其他維度的tensor

x = x.reshape(1, 2, -1)

5.張量拼接 cat & stack

torch.cat(a_tuple, dim)#

tuple 是乙個張量或者元組,在指定維度上進行拼接

torch.stack(a_tuple, dim)#

與cat不同的在於,cat只能在原有的某一維度上進行連線,stack可以建立乙個新的維度,將原有維度在這個維度上進行順序排列

#比如說,有2個4x4的張量,用cat就只能把它們變成乙個8x4或4x8的張量,用stack可以變成2x4x4.

6.張量拆分,chunk & split

torch.chunk(a, chunk_num, dim)#

在指定維度上將a變成chunk_num個大小相等的chunk,返回乙個tuple。如果最後乙個不夠chunk_num,就返回剩下的

torch.split(a, chunk_size, dim)#

與chunk相似,只是第二次引數變成了chunk_size

一、張量的乘法操作

1 * 點乘 & torch.mul 兩者用法相同,後者用了broadcast概念

#

標量k做*乘法的結果是tensor的每個元素乘以k(相當於把k複製成與lhs大小相同,元素全為k的tensor

a = torch.ones(3,4)

a = a * 2

'''tensor([[2., 2., 2., 2.],

[2., 2., 2., 2.],

[2., 2., 2., 2.]])

'''#

與行向量相乘向量作乘法 每列乘以行向量對應列的值(相當於把行向量的行複製,a的列數和向量數目相同),與列向量同理

b = torch.tensor([1,2,3,4])

a*b'''

tensor([[1., 2., 3., 4.],

[1., 2., 3., 4.],

[1., 2., 3., 4.]])

'''#

向量*向量,element-wise product

2.torch.mm&torch.matmul兩者用法相同,後者用了broadcast概念

torch.matmul(input, other, out=none) → tensor

#兩個張量的矩陣乘積。行為取決於張量的維數,如下所示:

#1. 如果兩個張量都是一維的,則返回點積(標量)。

#vector x vector

tensor1 = torch.randn(3)

tensor2 = torch.randn(3)

torch.matmul(tensor1, tensor2).size()

torch.size()

#2. 如果兩個引數都是二維的,則返回矩陣矩陣乘積。

#matrix x matrix

tensor1 = torch.randn(3, 4)

tensor2 = torch.randn(4, 5)

torch.matmul(tensor1, tensor2).size()

#torch.size([3, 5])

#3. 如果第乙個引數是一維的,而第二個引數是二維的,則為了矩陣乘法,會將1附加到其維數上。矩陣相乘後,將刪除前置尺寸。

#也就是讓tensor2變成矩陣表示,1x3的矩陣和 3x4的矩陣,得到1x4的矩陣,然後刪除1

tensor1 = torch.randn(3, 4)

tensor2 = torch.randn(3)

torch.matmul(tensor2, tensor1).size()

#torch.size([4])

#4. 如果第乙個引數為二維,第二個引數為一維,則返回矩陣向量乘積。

#matrix x vector

tensor1 = torch.randn(3, 4)

tensor2 = torch.randn(4)

torch.matmul(tensor1, tensor2).size()

#torch.size([3])

#5. 如果兩個自變數至少為一維且至少乙個自變數為n維(其中n> 2),則返回批處理矩陣乘法。

#如果第乙個引數是一維的,則在其維數之前新增乙個1,以實現批量矩陣乘法並在其後刪除。

#如果第二個引數為一維,則將1附加到其維上,以實現成批矩陣倍數的目的,然後將其刪除。

#非矩陣(即批量)維度可以被廣播(因此必須是可廣播的)。

#例如,如果input為(jx1xnxm)張量,而other為(k×m×p)張量,out將是(j×k×n×p)張量。最後兩維必須,滿足矩陣乘法

#batched matrix x broadcasted vector

tensor1 = torch.randn(10, 3, 4)

tensor2 = torch.randn(4)

torch.matmul(tensor1, tensor2).size()

#torch.size([10, 3])

#batched matrix x batched matrix

tensor1 = torch.randn(10, 3, 4)

tensor2 = torch.randn(10, 4, 5)

torch.matmul(tensor1, tensor2).size()

#torch.size([10, 3, 5])

#batched matrix x broadcasted matrix

tensor1 = torch.randn(10, 3, 4)

tensor2 = torch.randn(4, 5)

torch.matmul(tensor1, tensor2).size()

#torch.size([10, 3, 5])

tensor1 = torch.randn(10, 1, 3, 4)

tensor2 = torch.randn(2, 4, 5)

torch.matmul(tensor1, tensor2).size()

#torch.size([10, 2, 3, 5])

3.通用乘法:torch.tensordot

#

可以表示任意多維,任意組合形式的矩陣相乘

#如果 a = torch.tensor([1, 2, 3, 4]), b = torch.tensor([2, 3, 4, 5])

#想表示內積,直接令 dims=1 即可

#如果dimss=0則按照逐元素挨個相乘累加

#dimss可以為二維陣列,(dims_a, dims_b),指定兩個張量任意維度相乘

c =torch.tensordot(a, b, dims)

#a: b n f b: p f

c = torch.tensordot(a,b,dims=([-1],[-1])) #

c: b n p

4.einsum

#

使用愛因斯坦求和約定來計算多線性表示式(即乘積和)的方法,能夠以一種統一的方式表示各種各樣的張量運算(內積、外積、轉置、點乘、矩陣的跡、其他自定義運算)。

#a: i k , b: j k

c = torch.enisum('

ik, jk -> ij

', a,b) #

c : i j 及為下面的公式

其他可參考

Tensorflow01 認識張量Tensor

相較於1.0,tensorflow2.0是一次重大革命性的改進,主要是以下幾個方面。1 1.0 使用的是靜態圖機制,即分為構建階段和部署階段,構建階段只描述了計算圖,並沒有實質的進行計算,而是在執行階段中,在會話層進行統一的一次性計算,優點是高效節省資源,卻沒有中間結果,程式不夠簡潔,不宜除錯。2....

pytorch 張量 張量的生成

張量的生成 import torch import numpy as np 使用tensor.tensor 函式構造張量 a torch.tensor 1.0,1.0 2.2 print a 獲取張量的維度 print 張量的維度 a.shape 獲取張量的形狀大小 print 張量的大小 a.si...

pytorch張量追蹤

torch.tensor 是這個包的核心類。如果設定它的屬性 requires grad 為 true,那麼它將會追蹤對於該張量的所有操作。當完成計算後可以通過呼叫 backward 來自動計算所有的梯度。這個張量的所有梯度將會自動累加到.grad屬性.要阻止乙個張量被跟蹤歷史,可以呼叫 detac...