python - Pytorch LSTM grad 仅在最后一个输出上
问题描述
我正在处理不同长度的序列。但我只想根据序列末尾计算的输出对它们进行评分。
样本是有序的,因此它们的长度减少并且它们是零填充的。对于 5 个 1D 样本,它看起来像这样(为了可见性而忽略宽度尺寸):
array([[5, 7, 7, 4, 5, 8, 6, 9, 7, 9],
[6, 4, 2, 2, 6, 5, 4, 2, 2, 0],
[4, 6, 2, 4, 5, 1, 3, 1, 0, 0],
[8, 8, 3, 7, 7, 7, 9, 0, 0, 0],
[3, 2, 7, 5, 7, 0, 0, 0, 0, 0]])
对于 LSTM,我使用nn.utils.rnn.pack_padded_sequence
的是单个序列长度:
x = nn.utils.rnn.pack_padded_sequence(x, [10, 9, 8, 7, 5], batch_first=True)
Model构造函数中LSTM的初始化:
self.lstm = nn.LSTM(width, n_hidden, 2)
然后我调用 LSTM 并解压缩这些值:
x, _ = self.lstm(x)
x = nn.utils.rnn.pad_packed_sequence(x1, batch_first=True)
然后我应用一个全连接层和一个softmax
x = x.contiguous()
x = x.view(-1, n_hidden)
x = self.linear(x)
x = x.reshape(batch_size, n_labels, 10) # 10 is the sample height
return F.softmax(x, dim=1)
这给了我一个形状batch x n_labels x height
(5x12x10)的输出。
对于每个样本,我只想对最后一个输出batch x n_labels
(5 * 12)使用一个分数。我的问题是我怎样才能做到这一点?
一个想法是应用于tanh
从模型返回的最后一个隐藏层,但我不太确定这是否会产生相同的结果。是否可以有效地提取在序列末尾计算的输出,例如使用相同长度的序列pack_padded_sequence
?
解决方案
正如Neaabfi 的回答hidden[-1]
是正确的。为了更具体地解决您的问题,正如文档所写:
output, (h_n, c_n) = self.lstm(x_pack) # batch_first = True
# h_n is a vector of shape (num_layers * num_directions, batch, hidden_size)
在您的情况下,您有一堆只有forward
方向的 2 个 LSTM 层,然后:
h_n shape is (num_layers, batch, hidden_size)
可能,你可能更喜欢h_n
最后一层的隐藏状态,那么**这里是你应该做的:
output, (h_n, c_n) = self.lstm(x_pack)
h = h_n[-1] # h of shape (batch, hidden_size)
y = self.linear(h)
这是包装任何循环层的代码LSTM
,RNN
或者。具有对不同长度的序列执行循环计算的能力,而无需关心长度的顺序。GRU
DynamicRNN
DynamicRNN
推荐阅读
- python-3.x - 如何使用正则表达式过滤数据框列?
- javascript - 在 JS 中播放音频
- javascript - Nextjs getInitialProps 错误阻止在 Netlify 上构建
- python - 在 Python 中处理时,如何确保在短路点之后不会急切地评估任意函数调用列表?
- python - 一种在范围内查找众数值的方法
- c# - 为什么 .NET API 浏览器示例是用 C++ 而不是 C# 编写的?
- google-kubernetes-engine - BigQuery 显示“无效凭据”,即使服务帐号是编辑者
- javascript - 如何在多轴图表上的长度范围内制作间歇线来表示给定线的存在和不存在期间?
- xslt - SOA 转换中的 XSLT 映射以获取上个月的最大日期
- pandas - 为每个 CohortGroup 分配适当的 CohortPeriod 计数