Pytorch_第二篇_Pytorch tensors 張量基礎用法和經常使用操做

Pytorch tensors (張量)


Introduce

Pytorch的Tensors能夠理解成Numpy中的數組ndarrays(0維張量爲標量,一維張量爲向量,二維向量爲矩陣,三維以上張量統稱爲多維張量),可是Tensors 支持GPU並行計算,這是其最大的一個優勢。git

本文首先介紹tensor的基礎用法,主要tensor的建立方式以及tensor的經常使用操做。github

如下均爲初學者筆記。數組

tensors 基礎用法

  • tensors 經常使用建立方法
# 建立一個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])便可。
  • tensors 經常使用操做方式
# 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

相關文章
相關標籤/搜索