在成功地基于线性层实现了“从头开始”的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类的理解是什么吗?
答案 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
是否可以工作),当前您正在最大化批次尺寸。