【问题标题】:LSTM Model ImplementationLSTM 模型实现
【发布时间】:2020-04-26 08:17:48
【问题描述】:
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,:]

【问题讨论】:

  • 之所以选择最后一个lstm_out[:, -1, :]是因为LSTM之上的线性层会得到最后一个LSTM层的输出作为输入。
  • 我的网络收敛于我们的数据集的平均值,有什么理由这样做吗?

标签: python deep-learning sequence lstm


【解决方案1】:

从外观上看,您的问题类似于文本(即序列)分类问题,output_size 是您要分配文本的类数。通过选择lstm_out[:,-1,:],您实际上打算仅使用 LSTM 网络的最后隐藏状态来预测与输入文本关联的标签,这完全有道理。这就是人们通常对文本分类问题所做的事情。此后,您的线性层将为每个类输出 logits,然后您可以使用 nn.Softmax() 获取这些概率。

LSTM 网络的最后一个隐藏状态是 LSTM 先前所有隐藏状态的传播,这意味着它具有它已编码的先前输入状态的聚合信息(假设您使用的是单向 LSTM如你的例子)。因此,为了对输入文本进行分类,您必须根据输入文本中所有标记的整体信息(在 LSTM 的最后一个隐藏状态中编码)进行分类。这就是为什么您将最后一个隐藏状态提供给 LSTM 网络上的线性层。

注意:如果您打算进行序列标记(例如命名实体识别),那么您将使用 LSTM 网络的所有隐藏状态输出。在此类任务中,您实际上需要有关输入中特定标记的信息。

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2019-02-18
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多