日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?

發(fā)布時間:2023/11/28 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載鏈接:https://www.zhihu.com/question/51325408/answer/125426642
來源:知乎
?

這個問題無外乎有三個難點:

  1. 什么是sum
  2. 什么是reduce
  3. 什么是維度(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ù)字的:

  1. 找到3所在的2維矩陣在這個3維立方的索引:0
  2. 找到3所在的1維數(shù)組在這個2維矩陣的索引:1
  3. 找到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í)行步驟如下:

  1. 找到a中axis=1的元素,也就是[1,2],[3,4],[5,6],[7,8]這4個數(shù)組(兩兩一組,因為前兩個和后兩個的地位相同)
  2. 在axis=1的維度進行相加也就是[1,2]+[3,4]=[4,6],[5,6]+[7,8]=[12, 14]
  3. “塌縮”這一維度,也就是說“掉一層方括號”,得出[[ 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。