張量是一棵樹
長久以來,張量和其中維度的概念把我搞的暈頭轉向。
一維的張量是數組,二維的張量是矩陣,這也很有道理。
但是給一個二維張量,讓我算出它每一行的和,應該用 sum(dim=0) 還是 sum(dim=1)? 這個問題還得讓我想個一會兒。
更別說四維的張量是什么,一百維的張量又是什么,這種問題了,我不知道,想想就頭大。
但是直到把張量看成一棵樹,許多問題就迎刃而解~
如下圖所示,分別表示三種不同形狀的張量:
基本規律是:
- 不算最上邊的樹根節點,剩下的節點有幾層,那這個張量就是幾維的。(換種說法:張量的維數=樹高-1)
- 維度dim=0對應樹中的第二層,維度dim=1對應樹中的第三層,以此類推。
- 每一層的維度 = 這一層的每個節點有幾個親兄弟節點。
帶有維度的運算
張量以某個維度進行運算,就是:
- 把對應樹中這個維度的親兄弟節點都移動至重疊狀態
- 上述移動會導致部分葉子節點重疊,把重疊的葉子節點進行相應運算
- 刪除該維度
以 shape 為 [1, 2, 2] 的張量t 舉例說明:
t.sum(dim=1)
最終張量的shape是 [1, 2]
t.sum(dim=0)
第0維的節點只有一個,所以不用進行兄弟節點之間的合並,自然也不會有重疊的葉子節點,所以就不用運算,只需要刪除第0維即可。
最終張量的shape是 [2, 2]
t.sum(dim=2)
刪掉的恰好是最后一層葉子節點,數據上移到新的葉子節點中。
最終張量的shape是 [1, 2]
增加刪除維度
給張量增加一個維度等價於給樹增加一層。
給張量刪除一個維度等價於給樹刪除一層。
但是,增刪的維度是有限制的:維度必須為1。
刪除一個維度為1的層
增加一個維度為1的層
示例1
示例2
總結
將張量看成一個樹形結構能在某種程度更加直觀的理解張量的概念及其相關運算。