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。
在成功实现基于线性层的 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。