【问题标题】:Tensorflow gradient tape calculationTensorflow梯度磁带计算
【发布时间】:2022-01-04 03:47:39
【问题描述】:

我试图在以下代码中了解TF GRADIENT TAPE 的用途:

import tensorflow as tf
var = tf.Variable(5.0)
with tf.GradientTape() as tape:
    op = (2*var)+(var*var)
    diff = tape.gradient(op,var)
print (diff)

操作:

diff = tf.Tensor(12.0, shape=(), dtype=float32)

我很困惑,因为var=5op=(2*5)+(5*5)=>35,如果我是calculating the derivative of a constant,那么diff should be 0

我理解它12 的原因,因为它没有将var 视为5 而不是(2*var)+(var*var)=> 2var+var**2,因此计算此函数的导数变为2+2*var=>12

但我不明白的是,为什么不考虑给var 的值?

【问题讨论】:

  • 抱歉,不考虑为var 提供的值是什么意思?梯度2+2*var 显然是var 的函数。
  • @rchome 如果在tape 中考虑了var 的给定值,那么导数应该是0 对吧?
  • var 是一个变量,而不是一个常量。在这种情况下,op 相对于var 的导数是 12。如果您改为使用var = tf.constant(5.0),您将获得None 用于渐变,因为GradientTape 不是“观看”vartensorflow.org/guide/autodiff#controlling_what_the_tape_watches

标签: tensorflow keras tensorflow2.0 gradient-descent gradienttape


【解决方案1】:

它正在产生正确的结果。
tf.GradientTape 上下文将自动记录每个操作 这涉及一个变量。 如果您考虑以下函数关于var的偏导数

def v(var):
  return 2 * var + var * var

将是2 + 2*var,当var=5 的值将是2 + 2*5,即下面的渐变返回的12。

var = tf.Variable(5.0)
with tf.GradientTape() as tape:
  z = v(var)
diff = tape.gradient(z,var)
print (diff)
tf.Tensor(12.0, shape=(), dtype=float32)

尝试将变量更改为不同的值,对于函数v,等式2 + 2*var 成立。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2021-09-11
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多