儘管理論上和實踐中的張量(tensors)有一些細微差異,咱們仍然能給出這樣的定義:一個張量就是一個能夠容納N維數據及其線性操做的容器。編程
機器學習中的數據一般須要處理爲數值型的。特別地,當咱們特指神經網絡中的數據表示時,一般會提到所謂的張量。一個張量就是一個能夠容納N維數據的容器。不少時候,人們會把它和matrix錯誤地混用(matrix特指2維的張量),張量是matrix在N維空間的通常形式。數組
數學上講,張量不單單是一個數據容器,除了保存數值型數據,它也包括張量之間合法的線性變換。這種變換的例子如:叉積(cross product)和點積(dot product)。從計算機科學的角度看,把張量理解成面向對象中的對象而不是簡單的一個數據結構會更有幫助。網絡
(譯者注:由於做者提到張量不只包含數據,並且包含相應的操做,這與咱們在面向對象編程中的約定是一致的,因此做者更建議理解成是對象。)數據結構
雖然上面的描述都是正確的,但理論上和機器學習實踐中所指的張量仍是會有細微差異。咱們暫時簡單地將他們視爲數據結構,下圖歸納了張量和標量、向量跟矩陣的關係,以及如何用Numpy建立各類數據類型的代碼。在隨後的帖子中咱們還會看看張量的變換。機器學習
標量學習
單個數字就是一個標量。標量是一個0維的張量。所以,它具備0個軸,而且秩爲0。spa
這就是細微差異出現的地方,儘管單個數字能夠表示爲張量,但並非說它就應該是張量或者一般是張量。咱們有足夠的理由把數字視爲張量(討論張量的操做時會看到),但做爲一種存儲機制,這種表示會讓人困惑。scala
下面的代碼中,Numpy的多維數組ndarray被用來建立剛纔討論的示例結構。回憶一下,多維數組的ndim屬性返回數組的維數。code
import numpy as np x = np.array(42) print(x) print('A scalar is of rank %d' %(x.ndim)) 42 A scalar is of rank 0
向量對象
向量是1維的張量,在計算機科學中常常把它叫作數組。向量由一串數字組成,具備1個軸,而且秩爲1。
x = np.array([1, 1, 2, 3, 5, 8]) print(x) print('A vector is of rank %d' %(x.ndim)) [1 1 2 3 5 8] A vector is of rank 1
矩陣是秩爲2的張量,即它有兩個軸。在各類場景你都能熟悉這個概念,尤爲是把數據餵給你的scikit-learn機器學習模型時。矩陣就是把數字放入網格內(想象行和列),是一個2維的張量。
x = np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]]) print(x) print('A matrix is of rank %d' %(x.ndim)) [[1 4 7] [2 5 8] [3 6 9]] A matrix is of rank 2
三維張量(及更高的維度)
嚴格來講,上述結構都是合法的張量。一般談到張量時,都是將矩陣的概念推廣到N>=3維。爲了不混淆,咱們一般只把3維或更高維度的張量稱爲張量(一般而言,把標量‘42’稱爲張量沒什麼好處,只會讓人困惑)。