在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    AI課堂第16講:DL深度學(xué)習(xí)-PyTorch計(jì)算圖與模型構(gòu)造

    AI課堂第16講:DL深度學(xué)習(xí)-PyTorch計(jì)算圖與模型構(gòu)造

    前面幾節(jié)我們學(xué)習(xí)了深度學(xué)習(xí)模型的基本原理與實(shí)現(xiàn),下面我們繼續(xù)學(xué)習(xí)深度學(xué)習(xí)計(jì)算的各個(gè)組成部分,為后續(xù)學(xué)習(xí)復(fù)雜模型打下基礎(chǔ)。

    在學(xué)習(xí)模型構(gòu)造之前,我們先了解一下什么是計(jì)算圖。

    計(jì)算圖 (Computational Graph)

    計(jì)算圖是用來(lái)描述運(yùn)算的有向無(wú)環(huán)圖,有兩個(gè)主要元素:

    節(jié)點(diǎn) (Node) :節(jié)點(diǎn)表示數(shù)據(jù),如向量、矩陣、張量。

    邊 (Edge):邊表示運(yùn)算,如加減乘除卷積等。

    用計(jì)算圖表示:y=(x1+w)*(x2+w),如下圖所示:

    計(jì)算圖

    其中,x1, x2, w, y 分別為節(jié)點(diǎn),+ ,* 為節(jié)點(diǎn)之間的操作,即邊。故y=a*b,其中a=x1+w, b=x2+w。

    計(jì)算圖與梯度求導(dǎo)

    求上圖y對(duì)w的導(dǎo)數(shù),根據(jù)復(fù)合函數(shù)的求導(dǎo)法則,推理如下:

    對(duì)應(yīng)到計(jì)算圖中,就是根節(jié)點(diǎn)y到葉子節(jié)點(diǎn)w有兩條路徑y(tǒng)->a->w和y->b->w。根節(jié)點(diǎn)依次對(duì)每條路徑的子節(jié)點(diǎn)求導(dǎo),直到葉子節(jié)點(diǎn)w,最后把每條路徑的導(dǎo)數(shù)相加即可,其實(shí)就是我們前面講過(guò)的反向傳播求偏導(dǎo)。

    總結(jié)為y對(duì)w求導(dǎo),就是從計(jì)算圖中找到所有y到w的路徑,然后把各個(gè)路徑的導(dǎo)數(shù)進(jìn)行求和。

    代碼演示如下:

    PyTorch動(dòng)態(tài)計(jì)算圖演示

    計(jì)算圖又分為靜態(tài)計(jì)算圖 (Static Computational Graph)和動(dòng)態(tài)計(jì)算圖 (Dynamic Computational Graph):

    動(dòng)態(tài)圖就是運(yùn)算和搭建同時(shí)進(jìn)行,也就是可以先計(jì)算前面的節(jié)點(diǎn)的值,再根據(jù)這些值搭建后面的計(jì)算圖。

    靜態(tài)圖是先搭建圖,然后再輸入數(shù)據(jù)進(jìn)行運(yùn)算,是先定義后運(yùn)行的方式,之后再次運(yùn)行的時(shí)候就不再需要重新構(gòu)建計(jì)算圖,所以速度會(huì)比動(dòng)態(tài)圖更快,但是不靈活。

    PyTorch因其動(dòng)態(tài)圖的特色吸引了很多使用者,而Tensorflow早期是用的靜態(tài)圖導(dǎo)致開(kāi)發(fā)很不友好,后來(lái)也改成了動(dòng)態(tài)圖模式。

    tensorflow靜態(tài)計(jì)算圖演示

    動(dòng)態(tài)圖和靜態(tài)圖對(duì)比

    模型構(gòu)造

    PyTorch是基于動(dòng)態(tài)圖的模型搭建方式,我們可以隨機(jī)的在網(wǎng)絡(luò)中添加或者刪除網(wǎng)絡(luò)層。PyTorch為我們提供了非常方便的nn工具箱,我們搭建模型只需要定義一個(gè)繼承自nn.module的類(lèi)并實(shí)現(xiàn)其init和forward方法就可。

    其中nn.Module類(lèi)是nn模塊中提供的一個(gè)模型構(gòu)造類(lèi),是所有神經(jīng)網(wǎng)絡(luò)模塊的基礎(chǔ)類(lèi)。我們需要繼承它來(lái)定義我們的自己的網(wǎng)絡(luò)結(jié)構(gòu)。init方法中動(dòng)態(tài)綁定成員變量,定義我們的網(wǎng)絡(luò)結(jié)構(gòu)和相關(guān)參數(shù);forword方法中決定數(shù)據(jù)流經(jīng)這些成員變量的順序,即網(wǎng)絡(luò)的前向傳播方式。

    PyTorch中nn工具箱的結(jié)構(gòu)示意圖

    一般來(lái)說(shuō),我們構(gòu)建網(wǎng)絡(luò)模型時(shí)用到的卷積層、全連接層、Dropout層等含有可學(xué)習(xí)參數(shù)的層都是繼承nn.Module,而激活函數(shù)、池化層等函數(shù)類(lèi)型的層繼承于nn.functional。

    1.繼承Module類(lèi)來(lái)構(gòu)造模型

    下面定義的MLP 類(lèi)中無(wú)須定義反向傳播函數(shù)。系統(tǒng)將通過(guò)自動(dòng)求梯度而自動(dòng)生成反向傳播所需的backward 函數(shù)。

    我們可以實(shí)例化 MLP 類(lèi)得到模型變量 net 。下的代碼初始化 net 并傳輸數(shù)據(jù) X 做次前向計(jì)算。其中, net(X) 會(huì)調(diào)用 MLP 繼承 Module 類(lèi)的 __call__ 函數(shù),這個(gè)函數(shù)將調(diào)用 MLP 類(lèi)定義的forward 函數(shù)來(lái)完成前向計(jì)算。

    繼承Module類(lèi)的基礎(chǔ)模型

    這并沒(méi)有將 Module 類(lèi)命名為 Layer (層)或者 Model (模型)之類(lèi)的名字,這是因?yàn)樵擃?lèi)是一個(gè)可供自由組建的部件。它的子類(lèi)既可以是一個(gè)層(如PyTorch提供的 Linear 類(lèi)),又可以是個(gè)模型(如這定義的 MLP 類(lèi)),或者是模型的一個(gè)部分。我們下面來(lái)展示它的靈活性。

    2.Module的子類(lèi)

    PyTorch還提供了許多繼承自Module的類(lèi),如:Sequential、ModuleList和ModuleDict等。

    2.1Sequential類(lèi)

    當(dāng)模型的前向計(jì)算為簡(jiǎn)單的串聯(lián)各個(gè)網(wǎng)絡(luò)層的時(shí)候,可以通過(guò)Sequential類(lèi)以更加簡(jiǎn)單的方式來(lái)定義模型。Sequential可以接收一個(gè)子模塊的有序字典(OrderedDict)或者一系列的子模塊作為參數(shù)來(lái)逐一的添加Module的子類(lèi)的實(shí)例。在前向傳播計(jì)算的時(shí)候,可以將這些實(shí)例按照添加的順序逐一計(jì)算,向前傳播。這里實(shí)現(xiàn)一個(gè)MySequential類(lèi),其機(jī)制和Sequential類(lèi)似。

    舉例如下:

    Sequential類(lèi)模型

    2.2 ModuleList類(lèi)

    ModuleList類(lèi)接收一個(gè)子模塊的列表作為輸入,也可以類(lèi)似List那樣進(jìn)行append和extend操作。類(lèi)似于我們建立一個(gè)list,list內(nèi)部中的每一個(gè)元素代表一個(gè)網(wǎng)絡(luò)層。

    舉例如下:

    ModuleList類(lèi)模型

    ModuleList不同于一般的Python的list,加入到ModuleList里面的所有模塊的參數(shù)會(huì)被自動(dòng)添加到整個(gè)網(wǎng)絡(luò)中。

    2.3 ModuleDict類(lèi)

    ModuleDict類(lèi)接收一個(gè)子模塊的字典作為輸入,然后按照類(lèi)似于字典的形式進(jìn)行添加訪(fǎng)問(wèn)操作,舉例如下:

    ModuleDict類(lèi)模型

    ModuleDict和ModuleList類(lèi)似的是,ModuleDict實(shí)例僅僅是存放了一些模塊的字典,并沒(méi)有定義forward函數(shù),前向傳播的方式需要我們自己定義。同樣,ModuleDict也與Python的Dict有所不同,ModuleDict里的所有模塊的參數(shù)會(huì)被自動(dòng)添加到整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的內(nèi)部。

    3.構(gòu)造復(fù)雜的模型

    上面介紹的Sequential使用簡(jiǎn)單,但靈活性不足。通常我們還是自定義類(lèi),繼承nn.Module,去完成更復(fù)雜的模型定義和控制。下面的我們嘗試構(gòu)建一個(gè)復(fù)雜點(diǎn)的網(wǎng)絡(luò)來(lái)總結(jié)上面的內(nèi)容,該網(wǎng)絡(luò)中包含不被迭代的參數(shù),即常數(shù)參數(shù),還多次調(diào)用相同的層。

    復(fù)雜模型構(gòu)建

    總結(jié)

    PyTorch是基于動(dòng)態(tài)圖的模型搭建方式。

    Module類(lèi)是PyTorch中所有神經(jīng)網(wǎng)絡(luò)模塊的基類(lèi),也是個(gè)可供自由構(gòu)建的模塊。它的子類(lèi)既可以是個(gè)層(如PyTorch提供的 Linear 類(lèi)),又可以是一個(gè)模型(如這里是定義的 MLP 類(lèi)),或者是模型的一個(gè)部分。

    Sequential、ModuleList、ModuleDict類(lèi)都繼承自Module類(lèi)。

    Sequential內(nèi)的模塊需要按照順序排列,要保證相鄰層的輸入輸出大小相匹配,內(nèi)部forward功能已經(jīng)實(shí)現(xiàn)。與Sequential不同,ModuleList和ModuleDict并沒(méi)有定義一個(gè)完整的網(wǎng)絡(luò),它們只是將不同的模塊存放在一起,這些模塊之間沒(méi)有聯(lián)系也沒(méi)有順序(所以不用保證相鄰層的輸入輸出維度匹配),需要自己定義forward函數(shù)。

    雖然Sequential等類(lèi)可以使模型構(gòu)造更加簡(jiǎn)單,但直接繼承Module類(lèi)可以極大地拓展模型構(gòu)造的靈活性。

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶(hù)投稿
    上一篇 2022年7月6日 15:28
    下一篇 2022年7月6日 15:28

    相關(guān)推薦

    • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

      今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

      2022年11月26日
    • 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)論文(計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)論文七千字)

      今天小編給各位分享計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)論文的知識(shí),其中也會(huì)對(duì)計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)論文七千字進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! 計(jì)算機(jī)網(wǎng)絡(luò)方面的論文3000字…

      2022年11月26日
    • 手機(jī)上怎么買(mǎi)世界杯彩票(手機(jī)上怎么買(mǎi)世界杯輸贏)

      現(xiàn)在手機(jī)已經(jīng)成為大家生活中非常重要的工具之一,只要一部手機(jī)就可以解決衣食住行,最近世界杯火熱進(jìn)行,一些小伙伴想要買(mǎi)彩票,那么,手機(jī)上可以買(mǎi)世界杯彩票嗎?世界杯買(mǎi)球軟件是真的嗎?手機(jī)…

      2022年11月25日
    • 成都健康碼崩了是怎么回事(成都健康碼系統(tǒng)崩了)

      健康碼是大家出行必備的工具,有小伙伴反映自己健康碼崩了,上不了地鐵,那么成都健康碼崩了是怎么回事?成都健康碼怎么突然崩了?成都健康碼崩了是怎么辦?下面小編為大家?guī)?lái)成都健康碼崩了原…

      2022年11月24日
    • rnm退錢(qián)是什么意思網(wǎng)絡(luò)用語(yǔ)(rnm退錢(qián)是什么人)

      最近關(guān)于網(wǎng)絡(luò)用語(yǔ)使用還是有不少咨詢(xún)的,隨著卡塔爾世界杯的開(kāi)啟,網(wǎng)上也出現(xiàn)了不少新的網(wǎng)絡(luò)流行用語(yǔ),其中rnm退錢(qián)的梗也引發(fā)不少網(wǎng)友的好奇。rnm退錢(qián)是什么意思?很多網(wǎng)友對(duì)此好奇,rn…

      2022年11月24日
    • 關(guān)公繞后什么意思網(wǎng)絡(luò)用語(yǔ)(睜眼關(guān)公什么意思)

      關(guān)于一些網(wǎng)絡(luò)用語(yǔ)使用大家也都是比較關(guān)注的,最近關(guān)于關(guān)公繞后這個(gè)梗也是挺火的,不過(guò)還是有很多網(wǎng)友對(duì)關(guān)公繞后這個(gè)梗的含義不是很了解,關(guān)公繞后什么意思?這個(gè)梗說(shuō)的是什么呢?下面來(lái)看下網(wǎng)絡(luò)…

      2022年11月24日
    • 銳龍97900x參數(shù)規(guī)格跑分評(píng)測(cè) 銳龍97900x屬于什么檔次

      銳龍9 7900X是銳龍7000系列處理器中性能頂尖的型號(hào)之一,它采用了這一代標(biāo)配的zen4架構(gòu)和5nm制程工藝,那么它具體的參數(shù)跑分如何,在電腦上世紀(jì)發(fā)揮怎么樣呢,下面就來(lái)看看銳…

      2022年11月24日
    • 1千克等于多少磅

      克,此定義在1958年被美國(guó)以及其他英聯(lián)邦會(huì)員國(guó)承認(rèn)換算回來(lái),一千克等于262磅,一磅等于037千克英國(guó)在1963年開(kāi)始,依據(jù)度量衡法案的規(guī);1 磅=16 盎司=04536 千克 …

      2022年11月24日
    • 媽寶是什么意思網(wǎng)絡(luò)用語(yǔ)(媽寶男是什么意思)

      近期有關(guān)一些網(wǎng)絡(luò)用語(yǔ)使用也有不少人咨詢(xún),其中媽寶這個(gè)詞在網(wǎng)上熱度也是挺高的。媽寶是什么意思?部分網(wǎng)友可能對(duì)媽寶這個(gè)詞的含義不是很了解,據(jù)悉在網(wǎng)絡(luò)上面有媒體人評(píng)論大s的時(shí)候使用到了媽…

      2022年11月23日
    • vivox90pro配置參數(shù)跑分詳情 vivox90pro是什么屏幕

      vivox90pro參數(shù)配置詳情怎么樣?vivo手機(jī)在昨晚舉行了X90系列發(fā)布會(huì),有普通款、pro款以及pro+款三個(gè)版本,那么vivox90pro具體配置怎么樣呢?下面就讓小編為…

      2022年11月23日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息