LSTM模型实施

问题描述 投票:-1回答:1
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,:]

python deep-learning sequence lstm
1个回答
0
投票

从外观上看,你的问题就像一个文本(即序列)分类问题,用的是 output_size 是您要分配给文本的类的数量。通过选择 lstm_out[:,-1,:]实际上,你打算只用一个函数来预测与输入文本相关的标签。最后一个隐藏状态 的LSTM网络,这完全有道理。这就是人们通常对文本分类问题所做的工作。你的线性层,此后会输出每个类的对数,然后你可以用 nn.Softmax() 来得到这些的概率。

LSTM网络的最后一个隐藏状态是LSTM之前所有隐藏状态的传播,也就是说,它拥有它所编码的之前输入状态的汇总信息(我们考虑你的例子中使用的是单向LSTM)。因此,为了对一个输入文本进行分类,你必须根据输入文本内所有标记的整体信息来进行分类(这是在你的LSTM的最后一个隐藏状态中编码的)。这就是为什么你要输入 只是 最后一个隐藏状态到线性层,是在你的LSTM网络上。

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

© www.soinside.com 2019 - 2024. All rights reserved.