乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      tf.GradientTape詳解:梯度求解利器

       LibraryPKU 2021-04-08

      tf.GradientTape定義在tensorflow/python/eager/backprop.py文件中,從文件路徑也可以大概看出,GradientTape是eager模式下計(jì)算梯度用的,而eager模式(eager模式的具體介紹請(qǐng)參考文末鏈接)是TensorFlow 2.0的默認(rèn)模式,因此tf.GradientTape是官方大力推薦的用法。下面就來具體介紹GradientTape的原理和使用。

      Tape在英文中是膠帶,磁帶的含義,用在這里是由于eager模式帶來的影響。在TensorFlow 1.x靜態(tài)圖時(shí)代,我們知道每個(gè)靜態(tài)圖都有兩部分,一部分是前向圖,另一部分是反向圖。反向圖就是用來計(jì)算梯度的,用在整個(gè)訓(xùn)練過程中。而TensorFlow 2.0默認(rèn)是eager模式,每行代碼順序執(zhí)行,沒有了構(gòu)建圖的過程(也取消了control_dependency的用法)。但也不能每行都計(jì)算一下梯度吧?計(jì)算量太大,也沒必要。因此,需要一個(gè)上下文管理器(context manager)來連接需要計(jì)算梯度的函數(shù)和變量,方便求解同時(shí)也提升效率。

      舉個(gè)例子:計(jì)算y=x^2在x = 3時(shí)的導(dǎo)數(shù):

      x = tf.constant(3.0)
      with tf.GradientTape() as g:
        g.watch(x)
        y = x * x
      dy_dx = g.gradient(y, x)
      # y’ = 2*x = 2*3 = 6
       

      例子中的watch函數(shù)把需要計(jì)算梯度的變量x加進(jìn)來了。GradientTape默認(rèn)只監(jiān)控由tf.Variable創(chuàng)建的traiable=True屬性(默認(rèn))的變量。上面例子中的x是constant,因此計(jì)算梯度需要增加g.watch(x)函數(shù)。當(dāng)然,也可以設(shè)置不自動(dòng)監(jiān)控可訓(xùn)練變量,完全由自己指定,設(shè)置watch_accessed_variables=False就行了(一般用不到)。

      GradientTape也可以嵌套多層用來計(jì)算高階導(dǎo)數(shù),例如:

      x = tf.constant(3.0)
      with tf.GradientTape() as g:
        g.watch(x)
       
      with tf.GradientTape() as gg:
          gg.watch(x)
          y = x * x
        dy_dx = gg.gradient(y, x)      
      # y’ = 2*x = 2*3 =6
      d2y_dx2 = g.gradient(dy_dx, x)  # y’’ = 2
       

      另外,默認(rèn)情況下GradientTape的資源在調(diào)用gradient函數(shù)后就被釋放,再次調(diào)用就無法計(jì)算了。所以如果需要多次計(jì)算梯度,需要開啟persistent=True屬性,例如:

      x = tf.constant(3.0)
      with tf.GradientTape(persistent=True) as g:
        g.watch(x)
        y = x * x
        z = y * y
      dz_dx = g.gradient(z, x)  
      # z = y^2 = x^4, z’ = 4*x^3 = 4*3^3
      dy_dx = g.gradient(y, x)  # y’ = 2*x = 2*3 = 6
      del g  # 刪除這個(gè)上下文膠帶

      最后,一般在網(wǎng)絡(luò)中使用時(shí),不需要顯式調(diào)用watch函數(shù),使用默認(rèn)設(shè)置,GradientTape會(huì)監(jiān)控可訓(xùn)練變量,例如:

      with tf.GradientTape() as tape:
          predictions = model(images)
          loss = loss_object(labels, predictions)
      gradients = tape.gradient(loss, model.trainable_variables)

      這樣即可計(jì)算出所有可訓(xùn)練變量的梯度,然后進(jìn)行下一步的更新。對(duì)于TensorFlow 2.0,推薦大家使用這種方式計(jì)算梯度,并且可以在eager模式下查看具體的梯度值。

      參考

      https://tensorflow.google.cn/api_docs/python/tf/GradientTape

      https://github.com/tensorflow/tensorflow/blob/r2.0/tensorflow/python/eager/backprop.py

      https://tensorflow.google.cn/guide/effective_tf2?hl=zh_cn

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多