【问题标题】:How do I compute this gradient in TF 2.0?如何在 TF 2.0 中计算这个梯度?
【发布时间】:2021-08-09 09:15:00
【问题描述】:

我提供了一个我想要解决的最小示例。我已经定义了一个类,并且在不同的函数中定义了一些变量。我想知道如何跨函数跟踪这些变量以获得梯度。我想我必须使用tf.GradientTape,但我尝试了一些变体但没有成功。

class A():
     def __init__(self):
         self.alpha = tf.Variable(2.0)
     def f1(self):
         wt = self.alpha * 5.0
         return wt
     def f2(self):
         wt_f1 = f1()
         with tf.GradientTape() as tape:
            wt_f2 = wt_f1 * 10.0
            print(tape.gradient(wt_f2, self.alpha))

a = A()
print(a.f2())

最后一行返回None。很明显,wt_f2 相对于alpha 的导数是 50.0。但是,我得到None。任何的想法?我尝试在__init__ 函数中初始化一个持久渐变磁带,并使用它来观察wtself.alpha 等变量,但这没有帮助。有什么想法吗?

更新 1:

wt_f1 调用放在tape 下不起作用。

class A():
     def __init__(self):
         self.alpha = tf.Variable(2.0)
     def f1(self):
         wt = self.alpha * 5.0
         return wt
     def f2(self):
         with tf.GradientTape() as tape:
            wt_f1 = f1()
            wt_f2 = wt_f1 * 10.0
            print(tape.gradient(wt_f2, self.alpha))

这也返回None

【问题讨论】:

  • 您还需要将f1 调用放在磁带上下文中。
  • @xdurch0 这没有帮助,请参阅我的编辑。

标签: python-3.x tensorflow tensorflow2.0 gradient derivative


【解决方案1】:

您正在打印无。因为f2() 什么都不返回,所以你得到None。 删除打印:

a = A()
a.f2()

此外,一些编辑可能对您编写的代码有好处。

  1. 您在f1() 函数之前错过了self,这是因为您在其他地方定义了f1 函数。无论如何添加self.f1()
  2. print 语句移到tape 范围之外。因为最好在录制完成的地方获得渐变。
  3. 添加tape.watch() 以确保它被磁带跟踪。
class A():
    def __init__(self):
        self.alpha = tf.Variable(2.0)
    def f1(self):
        wt = self.alpha * 5.0
        return wt
    def f2(self):
        with tf.GradientTape() as tape:
            tape.watch(self.alpha)
            wt_f1 = self.f1()
            wt_f2 = wt_f1 * 10.0
        print(tape.gradient(wt_f2, self.alpha))

【讨论】:

  • 啊,我知道我错过了一些简单的东西:)。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2020-03-27
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多