代码+实例:深度学习中的“轴”全解
?PaperWeekly 原創 ·?作者|海晨威
學校|同濟大學碩士生
研究方向|自然語言處理
在深度學習中,軸,指的就是張量的層級,一般通過參數 axis/dim 來設定。很多張量的運算、神經網絡的構建,都會涉及到軸,但到底取哪個軸,卻不是那么容易把握。
下面會針對軸/axis/dim,基于 PyTorch 的代碼和實例,嘗試去理清張量運算中軸/axis/dim 的設定。
軸的概念
對于一個張量,它的 shape 有幾維,就對應有幾個軸,也就對應著張量的層級,最直觀的可以通過看最前面的方括號數量來判斷。
import?torch a?=?torch.Tensor([[1,2,3],?[4,5,6]]) b?=?torch.Tensor([[7,8,9],?[10,11,12]]) c?=?torch.Tensor([[[1,2,3],?[4,5,6]],?[[7,8,9],?[10,11,12]]]) print(a.shape)#?torch.Size([2,?3])上面的張量 a 和 b,都對應兩個軸。axis/dim=0 對應 shape [2, 3] 中的 2,axis/dim=1 對應 shape [2, 3] 中的 3,而張量 c 有三個軸。
張量運算時對軸參數的設定非常常見,在 Numpy 中一般是參數 axis,在 Pytorch 中一般是參數 dim,但它們含義是一樣的。
軸的使用
在做張量的拼接操作時,axis/dim 設定了哪個軸,那對應的軸在拼接之后張量數會發生變化
>>?torch.cat((a,b),?dim=0) tensor([[?1.,??2.,??3.],[?4.,??5.,??6.],[?7.,??8.,??9.],[10.,?11.,?12.]])>>?torch.cat((a,b),?dim=1) tensor([[?1.,??2.,??3.,??7.,??8.,??9.],[?4.,??5.,??6.,?10.,?11.,?12.]])對于上面 torch 中的 cat 操作,當設定 dim=0 時,兩個維度是 (2,3) 的張量合并成了一個 (4,3) 的張量,在第 0 維,張量數從 2 變成了 4,第 1 維沒有變化;當設定 dim=1 時,在第 1 維,張量數從 3 變成了 6,第 0 維沒有變化。
在做張量的運算操作時,axis/dim 設定了哪個軸,就會遍歷這個軸去做運算,其他軸順序不變。
>>?torch.softmax(a,?dim=0) tensor([[0.0474,?0.0474,?0.0474],[0.9526,?0.9526,?0.9526]])>>?torch.softmax(a,?dim=1) tensor([[0.0900,?0.2447,?0.6652],[0.0900,?0.2447,?0.6652]])對于上面 torch 中的 softmax 操作,當設定 dim=0 時,就是其他軸不變,單次遍歷 dim=0 軸的所有元素去做運算,上例中就相當于分別取了張量 a 中的第 0 列、第 1 列、第 2 列去做計算。
換一個角度,假設用 for 循環去遍歷一個張量,那運算中設定的 dim 就是被放在最內層的 for 循環,其它的軸保持正常的順序。
可以用下面的例子作為驗證,這里 tensor ?c ?的 shape 是 (m,n,p),用 for 循環去計算 torch.softmax(c, dim=1) 。
#?for循環計算方式 c?=?torch.Tensor([[[1,2,3],?[4,5,6]],?[[7,8,9],?[10,11,12]]])????#?shape?(2,2,3) m,n,p?=?c.shape res?=?torch.zeros((m,n,p)) for?i?in?range(m):for?j?in?range(p):res[i,:,j]?=?torch.softmax(torch.tensor([c[i,k,j]?for?k?in?range(n)]),?dim=0)??#這里對應最內層的for循環#?庫函數設定軸計算方式 res1?=?torch.softmax(c,?dim=1) print(res.equal(res1))????????#?Trueaxis/dim 使用小總結:
在做張量的拼接操作時,axis/dim 設定了哪個軸,那對應的軸在拼接之后樟樹會發生變化 axis/dim 設定了哪個軸,那對應的軸在拼接之后的張量數會發生變化
在做張量的運算操作時,axis/dim 設定了哪個軸,就會遍歷這個軸去做運算,其他軸順序不變
實際上,第一條拼接操作也可以用第二條去理解,但拼接的軸張量數會發生變化更好理解和記憶。
軸的實例
其實一個軸設定的變化,會帶來很大的差異,最典型的就是 BatchNorm 和 LayerNorm 了。
BatchNorm 和 LayerNorm 是針對數據的不同軸去做 norm,假設輸入數據的維度是(N,C,H,W),分別對應 batch 數,核數,高,寬,BatchNorm 就對應 dim=0,LayerNorm 就對應 dim=1,在不考慮移動平均等具體細節問題時,兩者在形式上可以統一,只有一個 dim 參數的差別。
Pytorch 的實現(簡化版)如下:
class?Norm(nn.Module):def?__init__(self,?num_features,?variance_epsilon=1e-12):super(Norm,?self).__init__()self.gamma?=?nn.Parameter(torch.ones(num_features))self.beta?=?nn.Parameter(torch.zeros(num_features))self.variance_epsilon?=?variance_epsilon????#?一個很小的常數,防止除0def?forward(self,?x,?dim):u?=?x.mean(dim,?keepdim=True)s?=?(x?-?u).pow(2).mean(dim,?keepdim=True)x_norm?=?(x?-?u)?/?torch.sqrt(s?+?self.variance_epsilon)return?self.gamma?*?x_norm?+?self.beta當然,不僅僅是在深度學習里面,在 Numpy,Pandas中,軸的設定都經常會遇到,但它們都是相通的,希望本文能幫你更好的理解它 —> 軸。
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的代码+实例:深度学习中的“轴”全解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 票据宝退不出怎么办
- 下一篇: 腾讯前三季度“注销式回购”883 亿港元