[转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?
轉(zhuǎn)載鏈接:https://www.zhihu.com/question/51325408/answer/125426642
來源:知乎
?
這個問題無外乎有三個難點:
- 什么是sum
- 什么是reduce
- 什么是維度(indices, 現(xiàn)在均改為了axis和numpy等包一致)
sum很簡單,就是求和,那么問題就是2和3,讓我們慢慢來講。其實徹底講清楚了這個問題,很多關(guān)于reduce,維度的問題都會恍然大悟。
0. 到底操作哪個維度??
sum這個操作完全可以泛化為任意函數(shù),我們就以sum為例,來看看各種情況。
首先是1維(按照tensorflow的說法其實是0維,后面會說)就是這樣:
a = 1
sum(a) => 1
那么看看2維的情況,為了看的更清楚,特意寫成了矩陣的形式:
a = [[1,2],[3,4]]
sum(a) => ???
仔細觀察,那么問題來了,sum(a)到底應(yīng)該是多少?有人說,當然是[3, 7](“橫著加”[[1+2],[3+4]]),有人說 不應(yīng)該是[4, 6](“豎著加”[[1+3],[2+4]])?嗎?還有人或說,不應(yīng)該是10(全加在一起)嗎?
誰是對的?
都是對的。
所以,對于多維數(shù)組元素的相加,如果不指定“如何加”,結(jié)果是未定義的,之所以有些時候沒有指定也可以得到結(jié)果,是因為不同的軟件或框架有默認的行為。對于tensorflow,默認行為是最后一種,也就是全加在一起。
1. 什么是維度?什么是軸(axis)?如何索引軸(axis)?
注:對Axis比較熟悉的讀者可跳過這部分解釋,只看加粗字體。
?
這是一個很大的問題,到底什么是維度呢?維基百科說:
維度,又稱維數(shù),是數(shù)學中獨立參數(shù)的數(shù)目。在物理學和哲學的領(lǐng)域內(nèi),指獨立的時空坐標的數(shù)目。
0維是一點,沒有長度。1維是線,只有長度。2維是一個平面,是由長度和寬度(或曲線)形成面積。3維是2維加上高度形成“體積面”。雖然在一般人中習慣了整數(shù)維,但在分形中維度不一定是整數(shù),可能會是一個非整的有理數(shù)或者無理數(shù)。
媽呀,好復(fù)雜,我只是想寫個tensorflow代碼呀。
那么,編程時,你就可以簡單的認為:
維度是用來索引一個多維數(shù)組中某個具體數(shù)所需要最少的坐標數(shù)量。
把這句話多讀幾遍,我想你肯定會有所頓悟。這里之所以說第一個1維的例子時0維,是因為,一個數(shù)字根本不需要索引,因為就只有一個呀。所有不同維度的形式如下:
0維,又稱0維張量,數(shù)字,標量:1
1維,又稱1維張量,數(shù)組,vector:[1, 2, 3]
2維,又稱2維張量,矩陣,二維數(shù)組:[[1,2], [3,4]]
3維,又稱3維張量,立方(cube),三維數(shù)組:[ [[1,2], [3,4]], [[5,6], [7,8]] ]
n維:你應(yīng)該get到點了吧~
再多的維只不過是是把上一個維度當作自己的元素
1維的元素是標量,2維的元素是數(shù)組,3維的元素是矩陣。
從0維到3維,邊看邊念咒語“維度是用來索引一個多維數(shù)組中某個具體數(shù)所需要最少的坐標。”
在紙上寫寫看,想要精確定位一個數(shù)字,需要幾個數(shù)字呢?比如上面例子中的3維數(shù)組,我們想要3這個數(shù)字,至少要3個數(shù)字定位,它的坐標是(0為索引起點):[0, 1, 0]
好了,現(xiàn)在就能說了,什么是軸(axis),如何索引axis(代碼中常用的變量名,后文就用axis代表軸)。
什么是axis,編程時,你就可以簡單的認為:
axis是多維數(shù)組每個維度的坐標。
同樣,把這句話多讀幾遍,我想你一定有體悟。
還拿3維來說,數(shù)字3的坐標是[0, 1, 0],那么第一個數(shù)字0的axis是0,第二個數(shù)字1的axis是1,第三個數(shù)字0的axis是2。
讓我們再看看我們是如何得到3這個數(shù)字的:
- 找到3所在的2維矩陣在這個3維立方的索引:0
- 找到3所在的1維數(shù)組在這個2維矩陣的索引:1
- 找到3這個數(shù)這個1維數(shù)組的索引:0
(這里最好寫在紙上看一看,括號比較多。)
也就是說,對于[ [[1,2], [3,4]], [[5,6], [7,8]] ]這個3維情況,[[1,2],[[5,6]], [[3,4], [7,8]]這兩個矩陣(還記得嗎,高維的元素低一個維度,因此三維立方的元素是二維矩陣)的axis是0,[1,2],[3,4],[5,6],[7,8]這4個數(shù)組(二維矩陣的元素是一維數(shù)組)的axis是1,而1,2,3,4,5,6,7,8這8個數(shù)的axis是2。
越往里axis就越大,依次加1。
那么,對于3維的情況,令a = [ [[1,2], [3,4]], [[5,6], [7,8]] ],tf.reduce_sum(a, axis=1)應(yīng)該輸出[[ 4, 6], [12, 14]],這就是處在axis=1的4個數(shù)組相加的結(jié)果,并reduce掉了一個維度。
這里需要注意的是,axis可以為負數(shù),此時表示倒數(shù)第axis個維度,這和Python中列表切片的用法類似。
那么什么是reduce呢?
2. 什么是reduce
reduce這個詞字面上來講,大多稱作“歸約”,但這個詞太專業(yè)了,以至于第一眼看不出來意思。我更傾向于解釋為“塌縮”,這樣就形象多了。對一個n維的情況進行reduce,就是將執(zhí)行操作的這個維度“塌縮”。還是上面tf.reduce_sum(a, axis=1)的例子,輸出[[ 4, 6], [12, 14]]是二維,顯然是被“塌縮”了,塌縮的哪個維度呢?就是被操作的維度,第2個維度,也就是axis=1(0開始索引)。tf.reduce_sum(a, axis=1)具體執(zhí)行步驟如下:
- 找到a中axis=1的元素,也就是[1,2],[3,4],[5,6],[7,8]這4個數(shù)組(兩兩一組,因為前兩個和后兩個的地位相同)
- 在axis=1的維度進行相加也就是[1,2]+[3,4]=[4,6],[5,6]+[7,8]=[12, 14]
- “塌縮”這一維度,也就是說“掉一層方括號”,得出[[ 4, 6], [12, 14]]
接下來是一個附加問題:
3. 什么是keepdims
上面的reduce已經(jīng)解釋了,“塌縮”的是被操作的維度,那么keepdims也就是保持維度,直觀來看就是“不掉一層方括號”,不掉哪層方括號呢?就是本來應(yīng)該被塌縮的那一層(詳細解釋見評論)。tf.reduce_sum(a, axis=1, keepdims=True)得出[[[ 4, 6]], [[12, 14]]],可以看到還是3維。這種尤其適合reduce完了要和別的同維元素相加的情況。
總結(jié)
以上是生活随笔為你收集整理的[转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tf.placeholder函数说明
- 下一篇: tf.reduce_sum()函数