在使用argmax()函數時,比如在深度學習里面計算acc經常要用到這個參數,這個參數返回的是沿軸axis最大值的索引值,對於,tensorflow和numpy用法是一樣的,此處我就用numpy來舉例說明。
argmax(a, axis=None, out=None)
# a 表示array # axis 表示指定的軸,默認是None,表示把array平鋪, # out 默認為None,如果指定,那么返回的結果會插入其中
- 1
- 2
- 3
- 4
對於axis默認為None的情況
首先我們看axis=None,也就是默認的時候:
二維array情況
a = np.array([[2,5,6],[7,6,1]]) print(np.argmax(a))
- 1
- 2
輸出結果為3,因為a里面7是最大的,如果沒有指定axis,默認就是None,相當於把array平鋪為:[2,5,6,7,6,1],那么結果就是3,因為索引3對應的值最大,再來看一下三維的情況
### 三維array的情況
b = np.random.randint(20,size=[3,2,2]) print(b) [[[ 0 16] [14 5]] [[16 6] [19 2]] [[11 11] [ 5 7]]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
這個里面,19最大,把它平鋪,19對應的索引就是6,那么np.argmax(b)就是6,經過驗證輸出就是6
對於給定axis的情況
如果給定axis,那么返回的就是沿着給定軸的最大索引,所謂沿着,我覺得就是投影,就是沿着這個軸投影,每一根投影線上最大值的索引。
二維情況分析
a = np.array([[2,5,6],[7,6,1]]) print(np.argmax(a,axis=1)) [2 0]
- 1
- 2
- 3
這次,我們給定axis=1,那么按照我們說的,就是沿着axis=1投影,看得出來,投影后我們只有兩個值,因為[2,5,6]在一根投影線上,相當於就是我理解的一個投影線,因為這些值投影后重疊了,相當於只有一個值,所以[7,6,1]也是一個投影線,然后在這兩個投影線取最大值的索引,對於[2,5,6]來說,最大值索引就是2,[7,6,1]最大值索引就是0,所以結果為[2,0]
然后,我們分析,當我們設置axis=0的時候,也就是沿着axis=0,投影,那么[2,7],[5,6],[6,1]分別在一個投影線上,所以結果為[1,1,0],經過驗證確實是這樣的。
三維情況分析
b = np.random.randint(20,size=[3,2,2]) print(b) [[[ 0 16] [14 5]] [[16 6] [19 2]] [[11 11] [ 5 7]]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
還是用上面的array來說,看一下結果:
print(np.argmax(b,axis=1)) [[1 0] [1 0] [0 0]]
- 1
- 2
- 3
- 4
同樣的分析,我們指定了軸為1,那么也就是說我們沿着axis=1軸投影,這是一個體,那么我們投影線相當於有3*2條,其實在同一根投影線上是axis=0和axis=2的一個組合,比如axis=1中第一個上的和axis=2的第一個上的組合,也就是b[0,:,0],b[0,:,1],b[2,:,0],b[2,:,1],b[3,:,0],b[3,:,1]這六條線的索引對應的最大值,我們看他們分別為[ 0 14],[16 5],[16 19],[6 2],[11 5],[11 7],那么結果就是[[1,0],[1,0],[0,0]]。
所以其實和二維是一樣的,所謂投影線,其實可以這樣表示,我們去axis=0,那么我們遍歷其他維度的大小,比如 arr[:,0,0],arr[:,0,1],也就是沿着那個軸,那么軸取全部值,然后再在投影線上找最大值對應索引。
總結
tensorflow里面的是一樣的用法,同時argmin()用法相同,只是他是求最小值的索引。