Pytorch的Tensors能夠理解成Numpy中的數組ndarrays(0維張量爲標量,一維張量爲向量,二維向量爲矩陣,三維以上張量統稱爲多維張量),可是Tensors 支持GPU並行計算,這是其最大的一個優勢。git
本文首先介紹tensor的基礎用法,主要tensor的建立方式以及tensor的經常使用操做。github
如下均爲初學者筆記。數組
# 建立一個5行3列的矩陣,數據類型爲long x = torch.empty(5,3,dtype=torch.long) # 相似的還有以下建立方式: x = torch.zeros() x = torch.ones() x = torch.ones_like(z) # 建立一個與z形狀相同的全1張量。 x = torch.rand() x = torch.eye(2,2) # 2x2單位矩陣 x = torch.tensor([5.5, 3.0]) # 向量 # x = torch.tensor(5.5) 標量 # x = torch.tensor([[5.5, 3.0]]) 矩陣 # 對x從新賦值(第一種是5X3全1矩陣,第二種是隨機,size與x相同,新制定type覆蓋舊type) x = x.new_ones(5,3,dtype=torch.double) x = torch.randn_like(x,dtype=torch.float) # tensor與numpy array的相互轉換,須要注意的是他們兩個用的都是共同的內存空間,即無論哪個的值發生改變,另一個都會相應改變 # 從numpy array建立tensor x = torch.from_numpy(np.ones(5)) # tensor轉化爲numpy array,調用.numpy()便可 y = x.numpy() # 返回x的規模,返回值類型爲元組tuple,張量也支持Numpy的shpae屬性 x.size() # 改變張量的維度,與Numpy的reshape相似 x = torch.randn(4, 4) # torch.Size([4, 4]) y = x.view(16) # torch.Size([16]), equal to y = torch.reshape(x,[16]) z = x.view(-1, 8) # torch.Size([2, 8]),其中-1表示從其餘維度大小推斷當前維度大小 # note: 當張量使用了permute和transpose後,tensor佔用的內存可能就變得不連續了,所以不能用view()函數來改變張量維度。必須先執行函數contiguous()使tensor佔用內存空間連續,其次再使用view()函數改變維度纔可。可是後續Pytorch增長了函數reshape()來改變tensor維度,至關於x.contigous().view()的功能,所以要改變維度直接使用y=torch.reshape(x,[16])便可。
# tensor的拼接 # cat(),不增長新的維度,在某維度上拼接tensor(理解向量或矩陣的拼接就行) # example 1 x = torch.randn(2,3) y = torch.randn(1,3) z = torch.cat((x, y), 0) # 在0維(行)拼接y (y做爲x的新行,增長行),維度爲(3,3) # example 2 x = torch.randn(2,3) y = torch.randn(2,1) z = torch.cat((x, y), 1) # 在1維(列)拼接y (y做爲x的新列,增長列),維度爲(2,4) # tensor的堆疊 # stack(),增長新的維度,在新的維度上拼接tensor(沒法想象,能夠理解成新建立一個維度,而後把要堆疊的tensor放上去,新維度的大小就爲要堆疊tensor的個數) # 如下例子請注意堆疊後新size中3的位置 # example 1 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 0) # 在第0維度上堆疊,維度爲 (3x1x2) # example 2 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 1) # 在第1維度上堆疊,維度爲 (1x3x2) # example 3 x = torch.randn(1,2) y = torch.randn(1,2) z = torch.randn(1,2) p = torch.cat((x, y,z), 2) # 在第2維度上堆疊,維度爲 (1x2x3) # tensor交換兩個維度,size中對應維度大小也交換,二維狀況下類比於二維矩陣的轉置 # transpose() # exmample x = torch.randn(1,2) x = x.transpose(0,1) # equal to x.transpose_(0,1) print(x.size()) # torch.Size([2, 1]) # note: 通常狀況下,函數後面有加_,如x.transpose_(0,1),纔會直接對原始tensor x進行操做,不然是返回一個新的tensor,而原始tensor x保持不變。 # tensor交換多個維度,size中對應維度大小也交換 # permute() # example x = torch.randn(1,2,3) x = x.permute(2,0,1) # 理解爲第零維度用原始第二維度填充,第一維度用原始第零維度填充,第二維度用原始第一維度填充 print(x.size()) # torch.Size([3, 1, 2]) # tensor壓縮和解壓維度 # squeeze(dim):若是dim維爲大小爲1,則去除,不然不作任何變化。如若不指定dim,則去除全部大小爲1的維度。 # unsqueeze(dim):在dim上添加一個維度,維度大小爲1。 # example z = torch.randn(1,2) z.squeeze_() print(z.size()) # torch.Size([2]) z.unsqueeze_(1) print(z.size()) # torch.Size([2, 1]) # note: 另一些經常使用的方法,好比.sum()、.max()、x[1:]等基本操做都與numpy中的用法相似。
本文參考-1函數
本文參考-2code