一尘不染

张量流中的“有状态对象”是什么?

python

在文档的某些部分(例如,Dataset Iterators
此处)中有对的引用Stateful Objects。它们究竟是什么?它们在图中起什么作用?

要澄清的是,在数据集文档中,有一个示例可以使用one_shot_iterator,因为它是无状态的:

dataset = tf.data.Dataset.range(100)
iterator = dataset.make_one_shot_iterator()

是什么使迭代器无状态?


阅读 276

收藏
2021-01-20

共1个答案

一尘不染

正如其他人提到的那样,有状态对象是持有状态的对象。
现在,以TensorFlow术语来说,状态是一些值或数据,该值或数据保存在对的不同调用之间tf.Session.run。最常见和最基本的状态对象是变量。您可以调用run一次以更新模型的参数(即变量),并且它们将在下一次调用时保持其分配的值run。这与大多数操作不同。例如,如果您有一个加法运算,该运算需要两个张量并输出第三个张量,run则不会保存它在一次调用中计算的输出值。实际上,即使您的图形仅包含具有恒定值的运算,每次调用时都会评估张量运算run,即使结果始终相同。
但是,
变量赋值时,它将“粘”
(顺便说一句,占用相应的内存,如果选择这样做,则在检查点上进行序列化)。

数据集迭代器也是有状态的。当您一次运行获得一条数据时,它将被消耗,然后在下一次运行中获得另一条数据。迭代器“记住”运行之间的位置。这就是为什么类似于初始化变量的原因,可以初始化迭代器(在它们支持时),以将其重置为已知状态。

从技术上讲,另一种有状态对象是随机操作。通常,人们将随机操作视为随机操作,但实际上它们拥有一个随机数生成器,该生成器的状态确实在两次运行之间保持,并且如果您提供了种子,那么在开始时它们将处于定义明确的状态会议。但是,据我所知,没有任何方法可以将随机操作重置为同一会话中的初始状态。

请注意,术语“有状态”经常(当不是特别指TensorFlow时)以略有不同的含义或以不同的抽象级别使用。例如,递归神经网络(RNN)一般说来,它们是有状态的,因为从概念上讲,它们的内部状态随收到的每个输入而变化。但是,当您在TensorFlow中创建RNN时,内部状态不一定必须处于有状态对象中!像任何其他类型的神经网络一样,TensorFlow中的RNN原则上将具有一些参数或权重,通常存储在可训练变量中-
因此,以TensorFlow术语而言,无论是否为RNN,所有可训练模型都具有针对训练参数的有状态对象。但是,Rens的内部状态在TensorFlow中用每次运行时获得的输入状态值和输出状态值表示(请参见tf.nn.dynamic_rnn),那么您可以在每次运行时从“零”状态开始,而不必理会最终的输出状态。当然,如果需要,您也可以将输入状态作为变量的值,然后将输出状态写回该变量,然后您的RNN内部状态将对TensorFlow处于“有状态”;也就是说,您将能够在一次运行中处理一些数据,并在下一次运行中处理“将数据留在原处”(视情况而定)。我知道这可能会有点混乱,但我希望这是有道理的。

2021-01-20