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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

代码+实例:深度学习中的“轴”全解

發布時間:2024/10/8 pytorch 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代码+实例:深度学习中的“轴”全解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?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))????????#?True

axis/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 的交流群里。

    總結

    以上是生活随笔為你收集整理的代码+实例:深度学习中的“轴”全解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。