PyTorch GRU 中隐藏状态的层顺序返回

Posted

技术标签:

【中文标题】PyTorch GRU 中隐藏状态的层顺序返回【英文标题】:Order of layers in hidden states in PyTorch GRU return 【发布时间】:2019-06-12 00:27:15 【问题描述】:

这是我正在查看的 API,https://pytorch.org/docs/stable/nn.html#gru

它输出:

    output 形状 (seq_len, batch, num_directions * hidden_​​size) h_n 形状 (num_layers * num_directions, batch, hidden_​​size)

对于多于一层的GRU,不知如何获取最后一层的隐藏状态,应该是h_n[0]还是h_n[-1]

如果是双向的,如何分片得到GRUs在两个方向上的最后隐藏层状态?

【问题讨论】:

我认为是h_n[-1]。刚刚确认了自己 【参考方案1】:

文档nn.GRU 对此很清楚。这是一个更明确的示例:

对于单向 GRU/LSTM(具有多个隐藏层):

output - 将包含所有时间步的所有输出特征th_n - 将返回所有层的隐藏状态(在最后一个时间步)。

要获得最后一个隐藏层和最后一个时间步的隐藏状态,使用:

first_hidden_layer_last_timestep = h_n[0]
last_hidden_layer_last_timestep = h_n[-1]

其中n 是序列长度。


这是因为描述说:

num_layers – 循环层数。例如,设置num_layers=2 意味着将两个 GRU 堆叠在一起形成一个堆叠的 GRU,第二个 GRU 接收第一个 GRU 的输出并计算最终结果。

因此,以相同的顺序相应地返回结果(即隐藏状态)是自然而直观的。

【讨论】:

我想你在想的是output,“包含来自 GRU 最后一层的输出特征 h_t 的张量”。 h_n 只包含所有隐藏层在最后一个时间步的隐藏状态。注意这些张量的尺寸。 你说得对,我的意思是写输出;我现在已经更新了答案。谢谢指正! 这对我来说并不明显。如果不是另一种方式,你怎么办,第一层是例如h_n[-1]? 我根据文档中的输入参数描述添加了一些解释。 +1 直觉可能是错误的,我自己确认了,因为最后一层 GRU hidden 的输出应该等于最后一步的output

以上是关于PyTorch GRU 中隐藏状态的层顺序返回的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pytorch LSTM/GRU/RNN 中指定不同的层大小

pytorch笔记:torch.nn.GRU

拟合自定义(非顺序)有状态 RNN (GRU) 模型

lstm和gru结构的再理解

pytorch 中的 torch.nn.gru 函数的输入是啥?

在 GRU 层 Pytorch 中训练将在一段时间后停止