Deep learning 仅返回零的LSTM(PyTorch)

Deep learning 仅返回零的LSTM(PyTorch),deep-learning,pytorch,lstm,recurrent-neural-network,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 = h

在基于线性层从零开始成功地实现了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,1,60的输入,可以描述为序列长度、批次大小、特征大小,其中特征大小是二进制的

我不知道你为什么要使用LogSoftmax,因为它不受欢迎,而且数值不稳定,建议你直接从你的网络中获取logits,但这不是问题所在,以后可能会出现

IIUC您试图预测形状序列长度、批次大小、特征大小的另一个张量,例如单词中的下一个字母或输入的后一个字母,不知道。
您需要执行LogSoftmaxdim=2不确定dim=-1是否有效,当前您正在对批次维度进行softmaxing。

您正在传递形状1,1,60的输入,该形状可以描述为序列长度、批次大小、特征大小,其中特征大小为二进制

我不知道你为什么要使用LogSoftmax,因为它不受欢迎,而且数值不稳定,建议你直接从你的网络中获取logits,但这不是问题所在,以后可能会出现

IIUC您试图预测形状序列长度、批次大小、特征大小的另一个张量,例如单词中的下一个字母或输入的后一个字母,不知道。
您需要执行LogSoftmaxdim=2不确定dim=-1是否有效,目前您正在对批处理维度进行softmaxing。

您是否应该在forward方法中为self.lstm提供隐藏状态和单元格状态h和c作为输入?@Shai因为唯一需要的是输入,其他将默认为零。@SzymonMaszke第一步它是有意义的。但是其他的时间步呢?取决于他的用例;我假设每个样本都是独立的,并且序列本身是自包含的示例,因此它应该像往常一样以零开始。如果样本之间存在某种连续性,例如第一批样本中的第一个、第一批样本中的第二个等,那么请确定,否则我看不出有任何理由使用其他值。是否应在正向方法中提供隐藏状态和单元格状态h和c作为self.lstm的输入?@Shai,因为唯一需要的是输入,other将默认为零。@SzymonMaszke这是它第一次有意义。但是其他的时间步呢?取决于他的用例;我假设每个样本都是独立的,并且序列本身是自包含的示例,因此它应该像往常一样以零开始。如果样品之间存在某种连续性,例如第一批样品中的第一个样品、第一批样品中的第二个样品等,那么请确定,否则我认为没有理由使用其他值。谢谢!在你发布答案的那一刻,我几乎就明白了。感谢您的帮助:@Johncowk当我们进行此项工作时,如果您的问题得到解决,请接受其中一个答案作为解决方案。看来你的答案和我的答案重复得一模一样,请不要通过重复答案来制造额外的噪音,因为这会把整个事情弄得一团糟我有点不好意思承认这一点,但我不知道该怎么做:/你可以点击向上/向下投票下的绿色勾号来接受答案。若要删除属于您的答案,请单击答案下的“更多”,然后使用“删除”。你可以阅读或阅读。哦,欢迎来到StackOverflow,祝您在这里过得愉快汉克斯!在你发布答案的那一刻,我几乎就明白了。感谢您的帮助:@Johncowk当我们进行此项工作时,如果您的问题得到解决,请接受其中一个答案作为解决方案。看来你的答案和我的答案重复得一模一样,请不要通过重复答案来制造额外的噪音,因为这会把整个事情弄得一团糟我有点不好意思承认这一点,但我不知道该怎么做:/你可以点击向上/向下投票下的绿色勾号来接受答案。若要删除属于您的答案,请单击答案下的“更多”,然后使用“删除”。你可以阅读或阅读。哦,欢迎来到StackOverflow,祝您在这里过得愉快D