Python Tensorflow 2.0自动签名间接修改(隐藏状态)在不应';T

Python Tensorflow 2.0自动签名间接修改(隐藏状态)在不应';T,python,tensorflow,tensorflow2.0,gradienttape,Python,Tensorflow,Tensorflow2.0,Gradienttape,所以,它说间接修改不应该起作用,这意味着改变是看不见的(看不见的改变到底意味着什么?) 但这段代码正确地计算了梯度: import tensorflow as tf class C: def __init__(self): self.x = tf.Variable(2.0) @tf.function def change(self): self.x.assign_add(2.0) @tf.function def f

所以,它说间接修改不应该起作用,这意味着改变是看不见的(看不见的改变到底意味着什么?)

但这段代码正确地计算了梯度:

import tensorflow as tf


class C:
    def __init__(self):
        self.x = tf.Variable(2.0)

    @tf.function
    def change(self):
        self.x.assign_add(2.0)

    @tf.function
    def func(self):
        self.change()
        return self.x * self.x


c = C()
with tf.GradientTape() as tape:
    y = c.func()
print(tape.gradient(y, c.x)) # --> tf.Tensor(8.0, shape=(), dtype=float32)
我是不是遗漏了什么


谢谢

这些文件缺少一个细节,需要澄清——“不可见”意味着AutoGraph的分析仪无法检测到更改。由于AutoGraph一次分析一个函数,因此在另一个函数中所做的修改对分析器不可见

但是,这个警告不适用于有副作用的Ops,比如修改TF变量——这些变量仍将正确地连接到图表中。因此,您的代码应该正常工作

该限制仅适用于对纯Python对象(列表、dict等)所做的一些更改,并且仅在使用控制流时存在问题

例如,下面是对代码的一个修改:

class C:
    def __init__(self):
        self.x = None

    def reset(self):
        self.x = tf.constant(10)

    def change(self):
        self.x += 1

    @tf.function
    def func(self):
      self.reset()
      for i in tf.range(3):
        self.change()
      return self.x * self.x


c = C()
print(c.func())
错误消息相当模糊,但如果您试图访问
tf主体内创建的op的结果,则会引发相同的错误。while\u loop
不使用
loop\u vars

    <ipython-input-18-23f1641cfa01>:20 func  *
        return self.x * self.x

    ... more internal frames ...

    InaccessibleTensorError: The tensor 'Tensor("add:0", shape=(),
dtype=int32)' cannot be accessed here: it is defined in another function or
code block. Use return values, explicit Python locals or TensorFlow
collections to access it. Defined in: FuncGraph(name=while_body_685,
id=5029696157776); accessed from: FuncGraph(name=func, id=5029690557264).
:20 func*
返回self.x*self.x
... 更多内部框架。。。
无法访问传感器错误:张量的张量(“添加:0”,形状=(),
无法在此访问dtype=int32)“:它是在另一个函数或
代码块。使用返回值、显式Python局部变量或TensorFlow
集合来访问它。定义于:FuncGraph(名称=while_body_685,
id=5029696157776);访问地址:FuncGraph(name=func,id=5029690557264)。

另外,作为一个附带问题,如果间接修改不起作用,那么有状态模型(如LSTM)如何存储其内部状态?谢谢您的回答。你能提供一个不正确使用间接修改的例子吗?当然-在答案中添加了一个例子。您链接的指南也有一些非常基本的示例。