【发布时间】:2019-11-11 22:50:21
【问题描述】:
在“从头开始”成功实现基于线性层的 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 类的理解错误吗?
【问题讨论】:
-
您不应该在
forward方法中提供隐藏状态和单元状态(h和c)作为self.lstm的输入吗? -
@Shai As documentation says 唯一需要的是
inputs,其他将默认为零。 -
@SzymonMaszke 第一次这样做是有意义的。但是其他时间步骤呢?
-
取决于他的用例;我假设每个样本都是独立的,并且序列本身是独立的示例,因此它应该像往常一样以
zeros开头。如果样本之间存在某种连续性(例如,第一批中的第一个,第一批中的第二个等),那么当然可以,否则我看不出其他值的原因。
标签: deep-learning pytorch lstm recurrent-neural-network