一、張量的維度操作
1.squezee & unsqueeze
x = torch.rand(5,1,2,1)2.張量擴散,在指定維度上將原來的張量擴充套件到指定大小,比如原來x是31,輸入size為[3, 4],可以將其擴大成34,4為原來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)
x = x.expand(*size)3.轉置,torch.transpose 只能交換兩個維度 permute沒有限制x = x.expand_as(y)# y:[3,4
x = torch.transpose(x, 1, 2) #4.改變形狀,view&reshape 兩者作用一樣,區別在於是當從多的維度變到少的維度時,如果張量不是在連續記憶體存放,則view無法變成合併維度,會報錯交換1和2維度
x = x.permute(1, 2, 3, 0) #
進行維度重組
x = x.view(1, 2, -1)#5.張量拼接 cat & stack把原先tensor中的資料按照行優先的順序排成乙個一維的資料(這裡應該是因為要求位址是連續儲存的),然後按照引數組合成其他維度的tensor
x = x.reshape(1, 2, -1)
torch.cat(a_tuple, dim)#6.張量拆分,chunk & splittuple 是乙個張量或者元組,在指定維度上進行拼接
torch.stack(a_tuple, dim)#
與cat不同的在於,cat只能在原有的某一維度上進行連線,stack可以建立乙個新的維度,將原有維度在這個維度上進行順序排列
#比如說,有2個4x4的張量,用cat就只能把它們變成乙個8x4或4x8的張量,用stack可以變成2x4x4.
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概念
#2.torch.mm&torch.matmul兩者用法相同,後者用了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
torch.matmul(input, other, out=none) → tensor3.通用乘法:torch.tensordot#兩個張量的矩陣乘積。行為取決於張量的維數,如下所示:
#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])
#4.einsum可以表示任意多維,任意組合形式的矩陣相乘
#如果 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
#使用愛因斯坦求和約定來計算多線性表示式(即乘積和)的方法,能夠以一種統一的方式表示各種各樣的張量運算(內積、外積、轉置、點乘、矩陣的跡、其他自定義運算)。
#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...