LSTM仅返回零(PyTorch)

时间:2019-07-01 09:16:17

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

在成功地基于线性层实现了“从头开始”的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类的理解是什么吗?

1 个答案:

答案 0 :(得分:2)

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

我不确定您为什么要使用LogSoftmax,因为它不鼓励使用并且在数值上不稳定,建议您使用torch.nn.CrossEntropyLoss将logit直接从您的网络中删除,但这不是问题所在(可能会稍后)。

IIUC,您正在尝试预测形状为(sequence_length, batch_size, feature_size)的另一个张量,例如单词中的下一个字母(或与输入的字母相同,dunno)。 您需要执行LogSoftmax(dim=2)(不确定dim=-1是否可以工作),当前您正在最大化批次尺寸。