<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>

          【小白學PyTorch】擴展之Tensorflow2.0 | 20 TF2的eager模式與求導

          共 3746字,需瀏覽 8分鐘

           ·

          2020-10-11 21:10

          【機器學習煉丹術】的學習筆記分享
          <<小白學PyTorch>>

          擴展之Tensorflow2.0 | 19 TF2模型的存儲與載入

          擴展之Tensorflow2.0?| 18 TF2構建自定義模型

          擴展之Tensorflow2.0?| 17 TFrec文件的創(chuàng)建與讀取

          擴展之Tensorflow2.0?| 16 TF2讀取圖片的方法

          擴展之Tensorflow2.0?| 15 TF2實現(xiàn)一個簡單的服裝分類任務

          小白學PyTorch | 14 tensorboardX可視化教程

          小白學PyTorch | 13 EfficientNet詳解及PyTorch實現(xiàn)

          小白學PyTorch | 12 SENet詳解及PyTorch實現(xiàn)

          小白學PyTorch | 11 MobileNet詳解及PyTorch實現(xiàn)

          小白學PyTorch | 10 pytorch常見運算詳解

          小白學PyTorch | 9 tensor數(shù)據(jù)結構與存儲結構

          小白學PyTorch | 8 實戰(zhàn)之MNIST小試牛刀

          小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解

          小白學PyTorch | 6 模型的構建訪問遍歷存儲(附代碼)

          小白學PyTorch | 5 torchvision預訓練模型與數(shù)據(jù)集全覽

          小白學PyTorch | 4 構建模型三要素與權重初始化

          小白學PyTorch | 3 淺談Dataset和Dataloader

          小白學PyTorch | 2 淺談訓練集驗證集和測試集

          小白學PyTorch | 1 搭建一個超簡單的網(wǎng)絡

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


          參考目錄:

          • 1 什么是eager模式

          • 2 TF1.0 vs TF2.0

          • 3 獲取導數(shù)/梯度

          • 4 獲取高階導數(shù)

          之前講解了如何構建數(shù)據(jù)集,如何創(chuàng)建TFREC文件,如何構建模型,如何存儲模型。這一篇文章主要講解,TF2中提出的一個eager模式,這個模式大大簡化了TF的復雜程度。

          1 什么是eager模式

          Eager模式(積極模式),我認為是TensorFlow2.0最大的更新,沒有之一。

          Tensorflow1.0的時候還是靜態(tài)計算圖,在《小白學PyTorch》系列的第一篇內(nèi)容,就講解了Tensorflow的靜態(tài)特征圖和PyTorch的動態(tài)特征圖的區(qū)別。Tensorflow2.0提出了eager模式,在這個模式下,也支持了動態(tài)特征圖的構建

          不得不說,改的和PyTorch越來越像了,但是人類的工具總是向著簡單易用的方向發(fā)展,這肯定是無可厚非的。

          2 TF1.0 vs TF2.0

          TF1.0中加入要計算梯度,是只能構建靜態(tài)計算圖的。

          1. 是先構建計算流程;
          2. 然后開始起一個會話對象;
          3. 把數(shù)據(jù)放到這個靜態(tài)的數(shù)據(jù)圖中。

          整個流程非常的繁瑣。

          #?這個是tensorflow1.0的代碼
          import?tensorflow?as?tf
          a?=?tf.constant(3.0)
          b?=?tf.placeholder(dtype?=?tf.float32)
          c?=?tf.add(a,b)
          sess?=?tf.Session()?#創(chuàng)建會話對象
          init?=?tf.global_variables_ini????????????????????????????tializer()
          sess.run(init)?#初始化會話對象
          feed?=?{
          ????b:?2.0
          }?#對變量b賦值
          c_res?=?sess.run(c,?feed)?#通過會話驅(qū)動計算圖獲取計算結果
          print(c_res)

          代碼中,我們需要用palceholder先開辟一個內(nèi)存空間,然后構建好靜態(tài)計算圖后,在把數(shù)據(jù)賦值到這個被開辟的內(nèi)存中,然后再運行整個計算流程。

          下面我們來看在eager模式下運行上面的代碼

          import?tensorflow?as?tf
          a?=?tf.Variable(2)
          b?=?tf.Variable(20)
          c?=?a?+?b

          沒錯,這樣的話,就已經(jīng)完成一個動態(tài)計算圖的構建,TF2是默認開啟eager模式的,所以不需要要額外的設置了。這樣的構建方法,和PyTorch是非常類似的。

          3 獲取導數(shù)/梯度

          假如我們使用的是PyTorch,那么我們?nèi)绾蔚玫?span style="cursor:pointer;">的導數(shù)呢?

          import?torch
          #?Create?tensors.
          x?=?torch.tensor(10.,?requires_grad=True)
          w?=?torch.tensor(2.,?requires_grad=True)
          b?=?torch.tensor(3.,?requires_grad=True)
          #?Build?a?computational?graph.
          y?=?w?*?x?+?b????#?y?=?2?*?x?+?3
          #?Compute?gradients.
          y.backward()
          #?Print?out?the?gradients.
          print(x.grad)????#?tensor(2.)
          print(w.grad)????#?tensor(10.)
          print(b.grad)????#?tensor(1.)

          都沒問題吧,下面用Tensorflow2.0來重寫一下上面的內(nèi)容:

          import?tensorflow?as?tf
          x?=?tf.convert_to_tensor(10.)
          w?=?tf.Variable(2.)
          b?=?tf.Variable(3.)
          with?tf.GradientTape()?as?tape:
          ????z?=?w?*?x?+?b
          dz_dw?=?tape.gradient(z,w)
          print(dz_dw)
          >>>?tf.Tensor(10.0,?shape=(),?dtype=float32)

          我們需要注意這幾點:

          • 首先結果來看,沒問題,w的梯度就是10;
          • 對于參與計算梯度、也就是參與梯度下降的變量,是需要用tf.Varaible來定義的;
          • 不管是變量還是輸入數(shù)據(jù),都要求是浮點數(shù)float,如果是整數(shù)的話會報錯,并且梯度計算輸出None;
          • tensorflow提供tf.GradientTape來實現(xiàn)自動求導,所以在tf.GradientTape內(nèi)進行的操作,都會記錄在tape當中,這個就是tape的概念。一個攝影帶,把計算的過程錄下來,然后進行求導操作

          現(xiàn)在我們不僅要輸出w的梯度,還要輸出b的梯度,我們把上面的代碼改成:

          import?tensorflow?as?tf
          x?=?tf.convert_to_tensor(10.)
          w?=?tf.Variable(2.)
          b?=?tf.Variable(3.)
          with?tf.GradientTape()?as?tape:
          ????z?=?w?*?x?+?b
          dz_dw?=?tape.gradient(z,w)
          dz_db?=?tape.gradient(z,b)
          print(dz_dw)
          print(dz_db)

          運行結果為:

          這個錯誤翻譯過來就是一個non-persistent的錄像帶,只能被要求計算一次梯度。 我們用tape計算了w的梯度,然后這個tape清空了數(shù)據(jù),所有我們不能再計算b的梯度。

          解決方法也很簡單,我們只要設置這個tape是persistent就行了:

          import?tensorflow?as?tf
          x?=?tf.convert_to_tensor(10.)
          w?=?tf.Variable(2.)
          b?=?tf.Variable(3.)
          with?tf.GradientTape(persistent=True)?as?tape:
          ????z?=?w?*?x?+?b
          dz_dw?=?tape.gradient(z,w)
          dz_db?=?tape.gradient(z,b)
          print(dz_dw)
          print(dz_db)

          運行結果為:

          4 獲取高階導數(shù)

          import?tensorflow??as?tf
          x?=?tf.Variable(1.0)
          with?tf.GradientTape()?as?t1:
          ????with?tf.GradientTape()?as?t2:
          ????????y?=?x?*?x?*?x
          ????dy_dx?=?t2.gradient(y,?x)
          ????print(dy_dx)
          d2y_d2x?=?t1.gradient(dy_dx,?x)
          print(d2y_d2x)
          >>>?tf.Tensor(3.0,?shape=(),?dtype=float32)
          >>>?tf.Tensor(6.0,?shape=(),?dtype=float32)

          想要得到二階導數(shù),就要使用兩個tape,然后對一階導數(shù)再求導就行了。

          - END -


          往期精彩回顧





          瀏覽 51
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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在线观看 | 美女极度色诱图片www视频 | 日韩香蕉视频 |