【问题标题】:LSTM returning only zeros (PyTorch)LSTM 仅返回零(PyTorch)
【发布时间】:2019-11-11 22:50:21
【问题描述】:

在“从头开始”成功实现基于线性层的 LSTM 后,我决定开始使用现有的 LSTM 类来简化操作并提高性能。 但不知何故,当我尝试它时,它只返回充满零的张量。 这是模型:

class pytorchLSTM(nn.Module):
    def __init__(self,input_size,hidden_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.lstm = nn.LSTM(input_size, hidden_size)
        self.softmax = nn.LogSoftmax(dim = 1)

    def forward(self, input):
        out, hidden = self.lstm(input)
        out = self.softmax(out)
        return out, hidden

输入是一个 (1,1,60) 张量,代表一个单热编码字母:

tensor([[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 1., 0.]]])

并且模型总是返回(我尝试修改输入中的值,但结果始终相同):

tensor([[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]],
        grad_fn=<LogSoftmaxBackward>)

知道我的错误在哪里以及我对 LSTM 类的理解错误吗?

【问题讨论】:

  • 您不应该在forward 方法中提供隐藏状态和单元状态(hc)作为self.lstm 的输入吗?
  • @Shai As documentation says 唯一需要的是inputs,其他将默认为零。
  • @SzymonMaszke 第一次这样做是有意义的。但是其他时间步骤呢?
  • 取决于他的用例;我假设每个样本都是独立的,并且序列本身是独立的示例,因此它应该像往常一样以zeros 开头。如果样本之间存在某种连续性(例如,第一批中的第一个,第一批中的第二个等),那么当然可以,否则我看不出其他值的原因。

标签: deep-learning pytorch lstm recurrent-neural-network


【解决方案1】:

您正在传递形状为(1,1,60) 的输入,可以描述为(sequence_length, batch_size, feature_size),其中feature_size 是二进制的。

我完全不知道您为什么要使用 LogSoftmax,因为它不鼓励使用并且数值不稳定,建议使用 torch.nn.CrossEntropyLoss 直接从您的网络中获取日志,但这不是这里的问题(可能会稍后) .

IIUC 您正在尝试预测另一个形状为 (sequence_length, batch_size, feature_size) 的张量,例如单词中的下一个字母(或稍后输入的相同,不知道)。 您需要做LogSoftmax(dim=2)(不确定dim=-1 是否有效),目前您正在对批量维度进行softmaxing。

【讨论】:

  • 谢谢!在您发布答案的那一刻,我几乎就明白了。谢谢你的帮助:)
  • @Johncowk 在我们讨论的过程中,如果您的问题得到解决,请接受其中一个答案作为解决方案。而且您的答案似乎与我的重复点完全相同,请不要通过重复答案来制造额外的噪音,因为它会使整个事情变得混乱。 :)
  • 我有点不好意思承认,但我不知道该怎么做:/
  • 您可以点击赞成/反对票下方的绿色勾号来接受答案。要删除答案(如果是您的),请单击答案下方的更多并使用删除。您可以阅读more about deletinghere for accepting。哦,欢迎来到 StackOverflow,祝您住宿愉快。 :D
猜你喜欢
  • 2017-07-26
  • 2020-11-05
  • 2021-01-26
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2022-01-07
相关资源
最近更新 更多