<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小白學(xué)PyTorch | 動(dòng)態(tài)圖與靜態(tài)圖的淺顯理解

          共 2360字,需瀏覽 5分鐘

           ·

          2020-09-24 03:18


          章節(jié)目錄:

          • 1 動(dòng)態(tài)圖的初步推導(dǎo)

          • 2 動(dòng)態(tài)圖的葉子節(jié)點(diǎn)

          • 3. grad_fn

          • 4 靜態(tài)圖

          本章節(jié)簡(jiǎn)單縷一縷PyTorch的動(dòng)態(tài)圖機(jī)制與Tensorflow的靜態(tài)圖機(jī)制(最新版的TF也支持動(dòng)態(tài)圖了似乎)。

          1 動(dòng)態(tài)圖的初步推導(dǎo)

          • 計(jì)算圖是用來描述運(yùn)算的有向無環(huán)圖
          • 計(jì)算圖有兩個(gè)主要元素:結(jié)點(diǎn)(Node)和邊(Edge);
          • 結(jié)點(diǎn)表示數(shù)據(jù) ,如向量、矩陣、張量;
          • 邊表示運(yùn)算 ,如加減乘除卷積等;

          上圖是用計(jì)算圖表示:

          其中呢, , . (a和b是類似于中間變量的那種感覺。)

          Pytorch在計(jì)算的時(shí)候,就會(huì)把計(jì)算過程用上面那樣的動(dòng)態(tài)圖存儲(chǔ)起來。現(xiàn)在我們計(jì)算一下y關(guān)于w的梯度:

          (上面的計(jì)算中,w=1,x=2)

          現(xiàn)在我們用Pytorch的代碼來實(shí)現(xiàn)這個(gè)過程:

          import?torch
          w?=?torch.tensor([1.],requires_grad?=?True)
          x?=?torch.tensor([2.],requires_grad?=?True)

          a?=?w+x
          b?=?w+1
          y?=?a*b

          y.backward()
          print(w.grad)

          得到的結(jié)果:

          2 動(dòng)態(tài)圖的葉子節(jié)點(diǎn)

          這個(gè)圖中的葉子節(jié)點(diǎn),是w和x,是整個(gè)計(jì)算圖的根基。之所以用葉子節(jié)點(diǎn)的概念,是為了減少內(nèi)存,在反向傳播結(jié)束之后,非葉子節(jié)點(diǎn)的梯度會(huì)被釋放掉 , 我們依然用上面的例子解釋:

          import?torch
          w?=?torch.tensor([1.],requires_grad?=?True)
          x?=?torch.tensor([2.],requires_grad?=?True)

          a?=?w+x
          b?=?w+1
          y?=?a*b

          y.backward()
          print(w.is_leaf,x.is_leaf,a.is_leaf,b.is_leaf,y.is_leaf)
          print(w.grad,x.grad,a.grad,b.grad,y.grad)

          運(yùn)行結(jié)果是:

          可以看到只有x和w是葉子節(jié)點(diǎn),然后反向傳播計(jì)算完梯度后(.backward()之后),只有葉子節(jié)點(diǎn)的梯度保存下來了。

          當(dāng)然也可以通過.retain_grad()來保留非任意節(jié)點(diǎn)的梯度值。

          import?torch
          w?=?torch.tensor([1.],requires_grad?=?True)
          x?=?torch.tensor([2.],requires_grad?=?True)

          a?=?w+x
          a.retain_grad()
          b?=?w+1
          y?=?a*b

          y.backward()
          print(w.is_leaf,x.is_leaf,a.is_leaf,b.is_leaf,y.is_leaf)
          print(w.grad,x.grad,a.grad,b.grad,y.grad)

          運(yùn)行結(jié)果:

          3. grad_fn

          torch.tensor有一個(gè)屬性grad_fn,grad_fn的作用是記錄創(chuàng)建該張量時(shí)所用的函數(shù),這個(gè)屬性反向傳播的時(shí)候會(huì)用到。例如在上面的例子中,y.grad_fn=MulBackward0,表示y是通過乘法得到的。所以求導(dǎo)的時(shí)候就是用乘法的求導(dǎo)法則。同樣的,a.grad=AddBackward0表示a是通過加法得到的,使用加法的求導(dǎo)法則。

          import?torch
          w?=?torch.tensor([1.],requires_grad?=?True)
          x?=?torch.tensor([2.],requires_grad?=?True)

          a?=?w+x
          a.retain_grad()
          b?=?w+1
          y?=?a*b

          y.backward()
          print(y.grad_fn)
          print(a.grad_fn)
          print(w.grad_fn)

          運(yùn)行結(jié)果是:

          葉子節(jié)點(diǎn)的.grad_fn是None。

          4 靜態(tài)圖

          兩者的區(qū)別用一句話概括就是:

          • 動(dòng)態(tài)圖:pytorch使用的,運(yùn)算與搭建同時(shí)進(jìn)行;靈活,易調(diào)節(jié)。
          • 靜態(tài)圖:老tensorflow使用的,先搭建圖,后運(yùn)算;高效,不靈活。

          靜態(tài)圖我們是需要先定義好運(yùn)算規(guī)則流程的。比方說,我們先給出

          , ,

          然后把上面的運(yùn)算流程存儲(chǔ)下來,然后把w=1,x=2放到上面運(yùn)算框架的入口位置進(jìn)行運(yùn)算。而動(dòng)態(tài)圖是直接對(duì)著已經(jīng)賦值的w和x進(jìn)行運(yùn)算,然后變運(yùn)算變構(gòu)建運(yùn)算圖。

          在一個(gè)課程http://cs231n.stanford.edu/slides/2018/cs231n_2018_lecture08.pdf中的第125頁(yè),有這樣的一個(gè)對(duì)比例子:

          這個(gè)代碼是Tensorflow的,構(gòu)建運(yùn)算的時(shí)候,先構(gòu)建運(yùn)算框架,然后再把具體的數(shù)字放入其中。整個(gè)過程類似于訓(xùn)練神經(jīng)網(wǎng)絡(luò),我們要構(gòu)建好模型的結(jié)構(gòu),然后再訓(xùn)練的時(shí)候再把數(shù)據(jù)放到模型里面去。又類似于在旅游的時(shí)候,我們事先定要每天的行程路線,然后每天按照路線去行動(dòng)。

          動(dòng)態(tài)圖呢,就是直接對(duì)數(shù)據(jù)進(jìn)行運(yùn)算,然后動(dòng)態(tài)的構(gòu)建出運(yùn)算圖。很符合我們的運(yùn)算習(xí)慣。

          兩者的區(qū)別在于,靜態(tài)圖先說明數(shù)據(jù)要怎么計(jì)算,然后再放入數(shù)據(jù)。假設(shè)要放入50組數(shù)據(jù),運(yùn)算圖因?yàn)槭鞘孪葮?gòu)建的,所以每一次計(jì)算梯度都很快、高效;動(dòng)態(tài)圖的運(yùn)算圖是在數(shù)據(jù)計(jì)算的同時(shí)構(gòu)建的,假設(shè)要放入50組數(shù)據(jù),那么就要生成50次運(yùn)算圖。這樣就沒有那么高效。所以稱為動(dòng)態(tài)圖

          動(dòng)態(tài)圖雖然沒有那么高效,但是他的優(yōu)點(diǎn)有以下:

          1. 更容易調(diào)試。
          2. 動(dòng)態(tài)計(jì)算更適用于自然語言處理。(這個(gè)可能是因?yàn)樽匀徽Z言處理的輸入往往不定長(zhǎng)?)
          3. 動(dòng)態(tài)圖更面向?qū)ο缶幊蹋覀儠?huì)感覺更加自然。
          - END -


          好文!卑微作者,在線求贊!




          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜操av | 99热国产在线 | 日皮视频免费观看网站 | 亚洲色情电影视频 | 美女草逼视频 |