LSTM 只返回零(PyTorch)

LSTM returning only zeros (PyTorch)

在成功实现基于线性层的 LSTM "from scratch" 之后,我决定开始使用现有的 LSTM class 来简化操作并提高性能。 但是不知何故,当我尝试它时,它只有 returns 个全为零的张量。 这是模型:

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.]]])

和模型 returns,始终如一(我尝试修改输入中的值,但结果始终相同):

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 的理解有误 class 吗?

您正在传递形状 (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。