分析tf.nn.dynamic_rnn张量流函数的输出

时间:2017-05-24 15:15:09

标签: tensorflow

我无法理解tf.nn.dynamic_rnn tensorflow函数的输出。该文档只是告诉输出的大小,但它没有说明每行/列的含义。来自文档:

  

输出:RNN输出Tensor

     

如果time_major == False(默认值),则形状为Tensor:       [batch_size, max_time, cell.output_size]

     

如果time_major == True,则形状为Tensor:       [max_time, batch_size, cell.output_size]

     

注意,如果cell.output_size是一个(可能是嵌套的)整数元组   或TensorShape个对象,然后outputs将是具有
的元组   与cell.output_size相同的结构,包含具有形状的张量   对应于cell.output_size中的形状数据。

     

:最终状态。如果cell.state_size是int,那么这将是   被塑造[batch_size, cell.state_size]。如果是的话   TensorShape,这将形成[batch_size] + cell.state_size   如果它是一个(可能是嵌套的)整数元组或TensorShape,那么这将是   是一个具有相应形状的元组。

outputs张量是一个三维矩阵,但每行/列代表什么?

1 个答案:

答案 0 :(得分:28)

tf.dynamic_rnn提供了两个输出outputsstate

  • outputs包含每个时刻RNN小区的输出。假设默认为time_major == False,假设您有一个由10个示例组成的输入,每个示例包含7个时间步长,每个时间步长都有一个大小为5的特征向量。然后您的输入将是10x7x5(batch_size x max_time x features)。现在,您将此作为输入提供给输出大小为15的RNN单元。从概念上讲,每个示例的每个时间步都输入到RNN,并且您将获得每个这样的15个长向量。这就是outputs包含的内容,在这种情况下,大小为10x7x15(batch_size x max_time x cell.output_size)的张量与每个时间步的RNN单元的输出。如果您只对单元格的最后一个输出感兴趣,则可以将时间维度切片以仅选择最后一个元素(例如outputs[:, -1, :])。
  • state包含处理完所有输入后的RNN状态。请注意,与outputs不同,它不包含有关每个时间步的信息,而只包含最后一个信息(即之后的最后一个)。根据您的情况,州可能有用也可能没用。例如,如果您有很长的序列,您可能不希望/能够在一个批处理中处理它们,并且您可能需要将它们分成几个子序列。如果你忽略state,那么每当你给出一个新的子序列时,就好像你开始一个新的;但是,如果您记住状态(例如输出或将其存储在变量中),您可以稍后将其反馈(通过initial_state的{​​{1}}参数)以便正确跟踪状态在完成整个序列后,RNN只会将其重置为初始状态(通常为全零)。 tf.nn.dynamic_rnn的形状可能会因您使用的RNN单元格而异,但通常情况下,每个示例都有一些状态(一个或多个尺寸为state x {{1其中batch_size取决于单元格类型和大小)。