class LSTM(nn.Module):
def __init__(self, input_size=1, output_size=1, hidden_size=100, num_layers=16):
super().__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
self.linear = nn.Linear(hidden_size, output_size)
self.num_layers = num_layers
self.hidden_cell = (torch.zeros(self.num_layers,12 ,self.hidden_size).to(device),
torch.zeros(self.num_layers,12 ,self.hidden_size).to(device))
def forward(self, input_seq):
#lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
lstm_out, self.hidden_cell = self.lstm(input_seq, self.hidden_cell)
predictions = self.linear(lstm_out[:,-1,:])
return predictions
这是我的LSTM模型,输入是一个4维向量。批量为16,时间戳为12。我想用12个序列向量来找到第13个向量,我的LSTM块有[16,12,48]个输出。 我的LSTM块有[16,12,48]输出。我不明白为什么我选择了最后一个,我的LSTM块有[16,12,48]的输出。out[:,-1,:]
从外观上看,你的问题就像一个文本(即序列)分类问题,用的是 output_size
是您要分配给文本的类的数量。通过选择 lstm_out[:,-1,:]
实际上,你打算只用一个函数来预测与输入文本相关的标签。最后一个隐藏状态 的LSTM网络,这完全有道理。这就是人们通常对文本分类问题所做的工作。你的线性层,此后会输出每个类的对数,然后你可以用 nn.Softmax()
来得到这些的概率。
LSTM网络的最后一个隐藏状态是LSTM之前所有隐藏状态的传播,也就是说,它拥有它所编码的之前输入状态的汇总信息(我们考虑你的例子中使用的是单向LSTM)。因此,为了对一个输入文本进行分类,你必须根据输入文本内所有标记的整体信息来进行分类(这是在你的LSTM的最后一个隐藏状态中编码的)。这就是为什么你要输入 只是 最后一个隐藏状态到线性层,是在你的LSTM网络上。
注意:如果你打算做序列标记(如Named-entity识别),那么你将使用LSTM网络上的所有隐藏状态输出。 如果您打算进行序列标记(如命名实体识别),那么您将使用LSTM网络的所有隐藏状态输出。在这样的任务中,您实际上需要输入中特定标记的信息。