我无法理解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
张量是一个三维矩阵,但每行/列代表什么?
答案 0 :(得分:28)
tf.dynamic_rnn
提供了两个输出outputs
和state
。
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
取决于单元格类型和大小)。