首页 > 解决方案 > 张量流中的“有状态对象”是什么?

问题描述

在文档的几个部分(例如Dataset Iterators 这里)有对Stateful Objects. 它们到底是什么,它们在图中扮演什么角色?

为了澄清,在 Dataset 文档中有一个例子,one_shot_iterator因为它是无状态的:

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

是什么让迭代器无状态?

标签: pythontensorflow

解决方案


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

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

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

请注意,经常(当人们不是特别提到 TensorFlow 时)术语“有状态”的使用略有不同,或者在不同的抽象级别上使用。例如,循环神经网络 (RNN)通常说是有状态的,因为从概念上讲,它们有一个内部状态,随着接收到的每个输入而变化。但是,当您在 TensorFlow 中创建 RNN 时,内部状态不一定必须在有状态对象中!与任何其他类型的神经网络一样,TensorFlow 中的 RNN 原则上将具有一些参数或权重,通常存储在可训练变量中 - 因此,在 TensorFlow 术语中,所有可训练模型,无论是否 RNN,都具有用于训练参数的状态对象。但是,RNN 的内部状态在 TensorFlow 中表示为您在每次运行时获得的输入状态值和输出状态值(请参阅tf.nn.dynamic_rnn),您可以在每次运行时从“零”状态开始,而忘记最终的输出状态。当然,如果需要,您也可以将输入状态作为变量的值,并将输出状态写回该变量,然后您的 RNN 内部状态将是 TensorFlow 的“有状态”;也就是说,您将能够在一次运行中处理一些数据,并在下一次运行中“拾取离开它的地方”(根据具体情况,这可能有意义也可能没有意义)。我知道这可能有点令人困惑,但我希望它是有道理的。


推荐阅读