TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋
1. axis的基本使用
axis常常用在numpy和tensorflow中用到,作為對(duì)矩陣(張量)進(jìn)行操作時(shí)需要指定的重要參數(shù)之一。設(shè)定axis=-1,0,1...,用來(lái)指定執(zhí)行操作的數(shù)據(jù)如何劃分。
一句話解釋:設(shè)axis=i,則沿著第i個(gè)下標(biāo)變化的方向進(jìn)行操作![1]
簡(jiǎn)單例子就不舉了,其他博客有很多,這里舉一個(gè)稍微復(fù)雜一點(diǎn)的三維矩陣的例子:
設(shè)embeddings是一個(gè)shape=[3,4,5]的矩陣,如下:
embeddings = [[[-0.30166972 0.25741747 -0.07442257 0.24321035 -0.3538919 ] [-0.22572032 0.1288028 -0.4686908 -0.07217035 0.05287632] [ 0.15845934 0.07064888 0.00922218 0.2841002 -0.24992025] [ 0.43347922 -0.43738696 -0.08176881 0.34185413 -0.2826353 ]] [[-0.08590135 0.06792518 -0.07807922 -0.28746927 -0.10613027] [ 0.07476929 0.132256 -0.0926154 0.39621904 0.2497718 ] [-0.15389556 0.0867373 0.19403657 -0.11003655 0.317669 ] [ 0.3949038 -0.17275128 0.34710506 -0.02576578 -0.17427891]] [[-0.27703786 0.02631402 0.22129896 -0.07714707 0.41439041] [-0.08512023 0.19059369 -0.13418713 -0.12881753 -0.26143318] [-0.333749 0.27034065 0.45429572 -0.46164128 -0.3955955 ] [ 0.24430516 -0.3841647 0.37126407 -0.463441 -0.1441828 ]]]
對(duì)embeddings矩陣執(zhí)行下面操作:
a = tf.math.argmax(embeddings, axis=-1) ? # tf.math.argmax=tf.argmax,用來(lái)返回最大數(shù)值對(duì)應(yīng)的index b = tf.math.argmax(embeddings, axis=1) c = tf.math.argmax(embeddings, axis=0) with tf.Session() as sess: ? ? sess.run(tf.global_variables_initializer()) ? ? ? ? print(embeddings.eval()) ? # a.eval 在打印時(shí),等同于 sess.run(a) ? ? print(a.eval()) ? ? print(b.eval()) ? ? print(c.eval())
得到的結(jié)果是:
[[1 1 3 0]
[1 3 4 0]
[4 1 2 2]] # axis=-1, shape=[3,4]
[[3 0 2 3 1]
[3 1 3 1 2]
[3 2 2 0 0]] # axis=1, shape=[3,5]
[[1 0 2 0 2]
[1 2 1 1 1]
[0 2 2 0 1]
[0 1 2 0 2]] # axis=0, shape=[4,5]
看懂了嗎?參考上面的一句話解釋,再結(jié)合矩陣的下標(biāo)表示理解一下。
剛剛的矩陣寫成下標(biāo)表示就是:
embeddings = [[[a000,a001,a002,a003,a004], [a010,a011,a012,a013,a014], [a020,a021,a022,a023,a024], [a030,a031,a032,a033,a034]] [[a100,a101,a102,a103,a104], [a110,a111,a112,a113,a114], [a120,a121,a122,a123,a124], [a130,a131,a132,a133,a134]] [[a200,a201,a202,a203,a204], [a210,a211,a212,a213,a214], [a220,a221,a222,a223,a224], [a230,a231,a232,a233,a234]]
以axis=0為例,則沿著第0個(gè)下標(biāo)(最左邊的下標(biāo))變化的方向進(jìn)行操作,也就是將除了第0個(gè)下標(biāo)外,其他兩個(gè)下標(biāo)都相同的部分分成一組,然后再進(jìn)行操作。具體分組如下(省略了一些組):
從上圖可以看出,每3個(gè)數(shù)分成一組,所以現(xiàn)在總共是分了4*5個(gè)組(所以最終返回的結(jié)果也是一個(gè)shape=[4,5]的矩陣),對(duì)每個(gè)組都執(zhí)行一次 reduce_max操作,將每個(gè)組的三個(gè)數(shù)中數(shù)值最大的數(shù)的index返回構(gòu)成矩陣即可。
這里需要特別說(shuō)明一下axis=-1的操作,可能對(duì)python不熟悉的人會(huì)不理解這里的-1是哪個(gè)維度。在pyhton中,-1代表倒數(shù)第一個(gè),也就是說(shuō),假如你的矩陣shape=[3,4,5],那么對(duì)這個(gè)矩陣來(lái)說(shuō),axis=-1,其實(shí)也就等于axis=2。因?yàn)檫@是個(gè)三維矩陣,所以axis可能的取值為0,1,2,所以最后一個(gè)就是2。你可以自己試試看兩個(gè)取值結(jié)果是否相同。
2. 對(duì)axis的理解
通過(guò)上面的例子,你可能已經(jīng)發(fā)現(xiàn)了,axis是將矩陣進(jìn)行分組,然后再操作。而分組則意味著會(huì)降維。
以剛剛的例子,原始矩陣的shape=[3,4,5],取axis=0再進(jìn)行操作后,得到的矩陣shape=[4,5]。同樣的,取axis=1再進(jìn)行操作后,得到的矩陣shape=[3,5]。取axis=-1(axis=2)再操作后,shape=[3,4]。掌握這一點(diǎn),能有利于你在神經(jīng)網(wǎng)絡(luò)中的變換或是數(shù)據(jù)操作中明確矩陣變換前后的形狀,從而加快對(duì)模型的理解。
總結(jié)
到此這篇關(guān)于TensorFlow和Numpy矩陣操作中axis理解及axis=-1解釋的文章就介紹到這了,更多相關(guān)矩陣操作中axis=-1的解釋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
參考資料
[1] 這個(gè)一句話解釋來(lái)源于:http://www.dbjr.com.cn/article/242077.htm
相關(guān)文章
python 時(shí)間 T 去掉 帶上ms 毫秒 時(shí)間格式的操作
這篇文章主要介紹了python 時(shí)間 T 去掉 帶上ms 毫秒 時(shí)間格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Python編程實(shí)現(xiàn)數(shù)學(xué)運(yùn)算求一元二次方程的實(shí)根算法示例
這篇文章主要介紹了Python編程實(shí)現(xiàn)數(shù)學(xué)運(yùn)算求一元二次方程的實(shí)根算法,涉及Python數(shù)學(xué)運(yùn)算求解方程的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04Python內(nèi)存管理器如何實(shí)現(xiàn)池化技術(shù)
Python中的內(nèi)存管理是從三個(gè)方面來(lái)進(jìn)行的,一對(duì)象的引用計(jì)數(shù)機(jī)制,二垃圾回收機(jī)制,三內(nèi)存池機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Python內(nèi)存管理器如何實(shí)現(xiàn)池化技術(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05Python實(shí)現(xiàn)partial改變方法默認(rèn)參數(shù)
這篇文章主要介紹了Python實(shí)現(xiàn)partial改變方法默認(rèn)參數(shù),需要的朋友可以參考下2014-08-08Python利用Beautiful Soup模塊修改內(nèi)容方法示例
Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python 庫(kù)。它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航、查找、修改文檔的方式。他還能夠修改HTML/XML文檔的內(nèi)容。這篇文章主要介紹了Python利用Beautiful Soup模塊修改內(nèi)容的方法,需要的朋友可以參考下。2017-03-03淺析python中的絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入
這篇文章主要是想和大家簡(jiǎn)單聊聊python中絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考下2023-09-09關(guān)于Python中Flask全局異常處理流程詳解
Flask是一個(gè)基于Python的Web框架,它提供了全局異常處理的機(jī)制來(lái)捕獲和處理應(yīng)用程序中的異常,本文將詳細(xì)介紹Flask的全局異常處理,并提供相應(yīng)的代碼示例,需要的朋友可以參考下2023-06-06解決py2exe打包后,總是多顯示一個(gè)DOS黑色窗口的問(wèn)題
今天小編就為大家分享一篇解決py2exe打包后,總是多顯示一個(gè)DOS黑色窗口的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06