在文档的某些部分(例如Dataset Iterators
here)中引用了Stateful Objects
。它们究竟是什么?它们在图中扮演什么角色?
为澄清起见,在数据集文档中,有一个one_shot_iterator
可以正常运行的示例,因为它是无状态的:
dataset = tf.data.Dataset.range(100)
iterator = dataset.make_one_shot_iterator()
什么使迭代器变为无状态?
答案 0 :(得分:2)
正如其他人提到的那样,有状态对象是持有状态的对象。 现在,以TensorFlow的术语来说,状态是在对tf.Session.run
的不同调用之间保存的一些值或数据。最常见和最基本的状态对象是变量。您可以调用一次run
来更新模型的参数(它们是变量),并且它们将在下次调用run
时保留其分配的值。这与大多数操作不同。例如,如果您有一个加法运算,该运算需要两个张量并输出第三个张量,则在对run
的一次调用中计算出的输出值不会保存。的确,即使您的图形仅包含具有恒定值的运算,即使结果始终相同,每次您调用run
时也会评估张量运算。 但是,当您将assign的值recurrent neural networks (RNNs)保留给变量时,它将“粘住” (顺便说一句,占用相应的内存,如果选择了,则在检查点上进行序列化)
数据集迭代器也是有状态的。如果一次运行获得一条数据,则该数据将被消耗,然后在下一次运行中获得另一条数据。迭代器“记住”两次运行之间的位置。这就是为什么类似于初始化变量的原因,可以初始化迭代器(在它们支持时),以将其重置为已知状态。
从技术上讲,另一种有状态对象是随机操作。通常,人们将随机操作视为随机操作,但实际上,它们拥有一个随机数生成器,该生成器的状态确实在两次运行之间保持,并且,如果您提供种子,则在开始时它们将处于定义明确的状态会议。但是据我所知,没有任何方法可以将随机操作重置为同一会话中的初始状态。
请注意,术语“有状态”经常(当不是特别指TensorFlow时)以略有不同的含义或以不同的抽象级别使用。例如,tf.nn.dynamic_rnn
通常被认为是有状态的,因为从概念上讲,它们具有内部状态,该内部状态随收到的每个输入而变化。但是,当您在TensorFlow中创建RNN时,内部状态不一定必须处于有状态对象中!像任何其他类型的神经网络一样,TensorFlow中的RNN原则上将具有一些参数或权重,通常存储在可训练变量中-因此,以TensorFlow术语而言,所有可训练模型(无论是否为RNN)都具有针对训练参数的有状态对象。但是,Rens的内部状态在TensorFlow中表示,具有每次运行时获得的输入状态值和输出状态值(请参阅enter image description here),并且您可以在每个运行时以“零”状态开始运行并忘记最终的输出状态。当然,您也可以根据需要将输入状态作为变量的值,然后将输出状态写回该变量,然后您的RNN内部状态将对TensorFlow处于“有状态”;也就是说,您将能够在一次运行中处理一些数据,并在下一次运行中处理“将数据留在原处”(视情况而定)。我知道这可能会有些混乱,但我希望这是有道理的。