LSTM 模型实现
LSTM Model Implementation
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] 输出。我不明白为什么我选择最后一个:
out[:,-1,:]
从外观上看,您的问题就像一个文本(即序列)class化问题,output_size
是您要分配的 class 个数文本到。通过选择 lstm_out[:,-1,:]
,您实际上打算仅使用 LSTM 网络的 last hidden state 来预测与输入文本关联的标签,这完全有道理。这就是人们通常对文本 class 化问题所做的事情。此后,您的线性层将为每个 class 输出 logits,然后您可以使用 nn.Softmax()
获得这些概率。
LSTM 网络的最后一个隐藏状态是 LSTM 先前所有隐藏状态的传播,这意味着它具有已编码的先前输入状态的聚合信息(假设您正在使用 uni-定向 LSTM,如您的示例所示)。因此,对于 class 验证输入文本,您将必须根据输入文本中所有标记的整体信息(在 LSTM 的最后隐藏状态中编码)进行 class 验证。这就是为什么您只 将最后一个隐藏状态提供给 LSTM 网络上的线性层。
注意:如果您打算进行序列标记(例如命名实体识别),那么您将使用 LSTM 网络的所有隐藏状态输出。在此类任务中,您实际上需要有关输入中特定标记的信息。
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] 输出。我不明白为什么我选择最后一个:
out[:,-1,:]
从外观上看,您的问题就像一个文本(即序列)class化问题,output_size
是您要分配的 class 个数文本到。通过选择 lstm_out[:,-1,:]
,您实际上打算仅使用 LSTM 网络的 last hidden state 来预测与输入文本关联的标签,这完全有道理。这就是人们通常对文本 class 化问题所做的事情。此后,您的线性层将为每个 class 输出 logits,然后您可以使用 nn.Softmax()
获得这些概率。
LSTM 网络的最后一个隐藏状态是 LSTM 先前所有隐藏状态的传播,这意味着它具有已编码的先前输入状态的聚合信息(假设您正在使用 uni-定向 LSTM,如您的示例所示)。因此,对于 class 验证输入文本,您将必须根据输入文本中所有标记的整体信息(在 LSTM 的最后隐藏状态中编码)进行 class 验证。这就是为什么您只 将最后一个隐藏状态提供给 LSTM 网络上的线性层。
注意:如果您打算进行序列标记(例如命名实体识别),那么您将使用 LSTM 网络的所有隐藏状态输出。在此类任务中,您实际上需要有关输入中特定标记的信息。