【发布时间】: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__ 函数中初始化一个持久渐变磁带,并使用它来观察wt 和self.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