機器學習中我們需要對多維度的數據進行處理,所以搞清楚數據的維度以及numpy 和 tensorflow 對於維度的定義就非常關鍵了。這裏我們以 numpy 爲例,因爲 Tensorflow 的數據格式與 numpy 類似。
1. Axis的數量即爲數據的維度
在數學和物理中,維度通常被解釋爲空間中描述一個位置所需的最少座標個數(基底的位數)。然而在 numpy 中 axis 的個數就是數據的維度,體現在具體數據上就是括號的層數。
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
舉個例子a,看似一個3x3的三維矩陣,然而,實際上只有兩層括號的嵌套,所以a只有兩個維度,也即兩個axis。只不過每個axis的長度爲3。
>>> a.shape
(3, 3)
我們要引用"5"這個元素,只需要索引axis[0] = 1,axis[1] = 1 即
>>> a[1,1]
5
2. 從內到外"扒開"張量
要寫一個高維度的數據還是比較麻煩,不過我們可以用rehape,將一個4x3的二維張量轉換成一個2x2x3 的三維張量,注意這裏: 4x3 = 2x2x3
>>> b=np.array([[1,4,8],[2,3,5],[2,5,1],[1,10,7]])
>>> b.shape
(4, 3)
>>> b=b.reshape(2,2,3)
>>> b
array([[[ 1, 4, 8],
[ 2, 3, 5]],
[[ 2, 5, 1],
[ 1, 10, 7]]])
>>> b.shape
(2, 2, 3)
我發現,要引用一個元素,比如'7',從內到外"扒開"來看,通常比較容易。最內層的括號 "7"排在第3個,即axis[2] = 2;中間層"7",所在的括號排在第2個,即 axis[1] = 1;最外層"7"所嵌套的括號排在第2個,即axis[0] = 1。所以要引用"7" 這個元素,我們需要
>>> b[1,1,2]
7
3. 對axis進行操作
在 numpy 中隊axis = n 的操作,即是對第n層(n從0開始)的操作。我們這裏以 sum 求和函數爲例。同樣的從內到外理解 sum 是如何對不同 axis (層) 進行操作的。
>>> b
array([[[ 1, 4, 8],
[ 2, 3, 5]],
[[ 2, 5, 1],
[ 1, 10, 7]]])
首先如果對最內層 (axis = -1 或 2)操作,可以想象,將最內層括號內的元素進行"擠壓","擠壓"(求和)後最內層括號消失即:
[ 1, 4, 8] —> 13
[ 2, 3, 5] —> 10
[ 2, 5, 1] —> 8
[ 1, 10, 7] —> 18
同時外層結構(括號嵌套)不變
>>> b.sum(axis = 2)
array([[13, 10],
[ 8, 18]])
對中間層 (axis = 1)的操作,即可以想象,將中間層括號內的元素進行"擠壓",完成後,中間層括號消失。
[ 1, 4, 8] + [ 2, 3, 5] —> [ 3, 7, 13]
[ 2, 5, 1] + [ 1, 10, 7]—>[ 3, 15, 8]
同時內層和外層結構(括號嵌套)不變
>>> b.sum(axis = 1)
array([[ 3, 7, 13],
[ 3, 15, 8]])
對最外層(axis = 0)的操作,即可以想象,將最外層內的元素進行"擠壓",完成後,最外層括號消失。
[[ 1, 4, 8], [ 2, 3, 5]] + [[ 2, 5, 1], [ 1, 10, 7]] —>[[ 3, 7, 13],[ 3, 15, 8]]
同時內兩層結構(括號嵌套)不變
>>> b.sum(axis = 1)
array([[ 3, 7, 13],
[ 3, 15, 8]])
4. 總結
剛開始接觸 axis 操作的時候與大多數人理解一樣,axis = 0 即代表往跨行操作,axis = 1即代表往跨列操作。這種理解方式僅對二維矩陣有效,遇到高維張量就束手無策了。希望今天介紹的這種從內到外"扒開"張量的理解方式對讀者有所啓發。
首發steemit
歡迎掃描二維碼關注我的微信公衆號“tensorflow機器學習”,一起學習,共同進步