Pytorch深度學習基礎之Tensor

當下流行的深度學習框架,都會涉及一個基本的概念,就是張量(Tensor)。張量是什麼?簡單的理解,就是數據的容器。零維張量就是數字或者標量,一維張量就是向量,二維或者更高維就是矩陣。由於機器只能處理數字相關的信息,因此不管是圖片仍是天然語言的處理,都須要把輸入信息轉化爲高維數字矩陣的形式。python

 

 

那爲什麼須要新引入張量,而不直接使用numpy的ndarray呢?Tensor提供了一些輔助神經網絡訓練的功能,比ndarray更適合深度學習。git

 

簡而言之一句話,就像python裏的int,float,string等數據類型同樣,tensor就是深度學習框架的基本數據類型,以致於Google的深度學習框架名字就叫TensorFlow,就是「張量的流」的意思。github

1.1.1.1.1      Tensor(張量)數組

咱們初始化一個3行2列的矩陣,直接把數組直接賦值給torch.Tensor,能夠經過Tensor的size函數查看張量的維度。網絡

>>>import torch框架

>>> a = torch.Tensor([[1,1],[2,2],[3,3]])函數

>>> a學習

tensor([[ 1.,  1.],人工智能

        [ 2.,  2.],blog

        [ 3.,  3.]])

>>> a.size()

torch.Size([3, 2])

 

在實際的應用場景中,咱們可貴會直接從數組中初始化Tensor,更多狀況下,會初始化一個全0或全1亦或是隨機初始值的特定維度的張量。

 

有幾種經常使用的方法,好比獲得3行2列值全爲0的張量:

>>> a = torch.zeros((3,2))

>>> a

tensor([[ 0.,  0.],

       [ 0.,  0.],

       [ 0.,  0.]])

好比獲得3行2列的隨機值的張量:

>>> b = torch.randn((3,2))

>>> b

tensor([[-0.0648, -1.2692],

       [ 0.9562,  0.0018],

       [-1.3293,  0.0097]])

 

對於張量內的數據訪問,與numpy是同樣的,直接經過索引訪問和修改。

>>> b

tensor([[-0.0648, -1.2692],

       [ 0.9562,  0.0018],

       [-1.3293,  0.0097]])

>>>b[0,0]

tensor(1.00000e-02 *

      -6.4819)

>>>b[0,1]

tensor(-1.2692)

>>>b[0,1]=888

>>> b

tensor([[-6.4819e-02,  8.8800e+02],

       [ 9.5625e-01,  1.8241e-03],

       [-1.3293e+00,  9.7056e-03]])

 

關於Pytorch的Tensor,還有重要一點,就是能夠和numpy的ndarray互轉。

>>>np_b = b.numpy()

>>> np_b

array([[-6.4819142e-02,  8.8800000e+02],

      [ 9.5624775e-01,  1.8241187e-03],

      [-1.3292531e+00,  9.7055538e-03]],dtype=float32)

 

從numpy的ndarray轉爲torch的tensor一樣簡單,代碼以下:

>>> a = np.array([[1,1],[2,2]])

>>> a

array([[1, 1],

      [2, 2]])

>>>tensor_a = torch.from_numpy(a)

>>> tensor_a

tensor([[ 1, 1],

       [ 2,  2]], dtype=torch.int32)

 

張量加法有兩種形式,一種是直接使用加號,另外一種使用torch.add方法:

>>> a = torch.Tensor([1,1])

>>> b = torch.Tensor([2,2])

>>>a+b

tensor([ 3., 3.])

>>>torch.add(a,b)

tensor([ 3.,  3.])

 

這裏須要特別說明,深度學習裏的張量計算,不是線性代數裏的矩陣運算,並且元素直接計算,兩個參與計算的張量順序無關,好比a*b=b*a(線性代數裏的矩陣是不能夠的),另外是張量的元素直接加減或乘除,各張量之間行數與列數必須相同,有幾個例外:

1,  標量,直接把標題做用於張量的每一個元素。

>>> a

                       

tensor([[ 1.,  1.],

       [ 2.,  2.]])

>>> a+1

                       

tensor([[ 2.,  2.],

       [ 3.,  3.]])

2,  一維向量,向量長度需等於張量列數,各元素做用於列元素

>>> a =torch.Tensor([[1,1],[2,2]])

>>> a

tensor([[ 1.,  1.],

       [ 2.,  2.]])

>>>b = torch.Tensor([0.5,1.5])         #b是行向量

>>> a*b

tensor([[ 0.5000,  1.5000],

       [ 1.0000,  3.0000]]) #行向量,元素操做在列上

 

3,  行數相同,列數爲1,元素使用於各行

>>>c = torch.Tensor([[0.5],[1.5]])     #c是2行1列的張量

>>> a*c

tensor([[ 0.5000,  0.5000],

       [ 3.0000,  3.0000]])#列向量,元素操做在各行上

 

view方法,就是對矩陣進行reshape,這個方法很重要,由於多層神經網絡在相互鏈接的時候,先後兩個層的維度是須要對齊的,這時須要對tensor的size進行view:

>>> x = torch.randn(4, 4)

>>> y = x.view(-1,8) #負1表示這一個維度經過推斷獲得。

>>> z = x.view(16)

(torch.Size([4, 4]), torch.Size([2, 8]),torch.Size([16]))

關於做者:魏佳斌,互聯網產品/技術總監,北京大學光華管理學院(MBA),特許金融分析師(CFA),資深產品經理/碼農。偏心python,深度關注互聯網趨勢,人工智能,AI金融量化。致力於使用最前沿的認知技術去理解這個複雜的世界。AI量化開源項目:https://github.com/ailabx/ailabx

掃描下方二維碼,關注:AI量化實驗室(ailabx),瞭解AI量化最前沿技術、資訊。

相關文章
相關標籤/搜索