當下流行的深度學習框架,都會涉及一個基本的概念,就是張量(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量化最前沿技術、資訊。