如何建立用于异常检测的简单LSTM模型

时间:2019-07-29 17:39:15

标签: python deep-learning pytorch lstm

我想在PyTorch中创建一个LSTM模型,该模型将用于异常检测,但是我在理解这样做的细节时遇到了麻烦。

请注意,我的训练数据由80个时间步长的16个功能部件组成。这是我为以下模型编写的内容:

class AutoEncoder(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, layer_dim):
        super(AutoEncoder, self).__init__()
        self.hidden_dim = hidden_dim
        self.layer_dim = layer_dim

        self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True)
        self.fc1 = torch.nn.Linear(hidden_dim, hidden_dim)
        self.fc2 = torch.nn.Linear(hidden_dim, input_dim)   
    def forward(self, x):
        h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()
        c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()

        out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
        out = self.fc1(out[:, -1, :]) 
        out = self.fc2(out)
        return out

input_dim = 16
hidden_dim = 8
layer_dim = 2
model = AutoEncoder(input_dim, hidden_dim, layer_dim)

我认为我没有正确构建模型。它如何知道我正在向其提供80个时间步长的数据?自动编码器将如何重构这80个时间步长的数据?

我很难在网上理解这些材料。最后一层必须是什么?

1 个答案:

答案 0 :(得分:1)

如果您检出PyTorch LSTM documentation,将会看到LSTM方程式已应用于序列中的每个时间步长。 nn.LSTM将在内部获得seq_len维度并从那里进行优化,因此您无需提供时间步数。

此刻,线路

out = self.fc1(out[:, -1, :])

正在选择最终隐藏状态(对应于时间步骤80),然后将其投影到大小为input_dim的空间上。

要输出长度为80的序列,您应该为每个隐藏状态提供一个输出。所有隐藏状态都堆积在out中,因此您可以简单地使用

out = self.fc1(out)
out = self.fc2(out)

我还要注意,如果在隐藏状态下进行编码后必须具有两个完全连接的层,则应在两者之间使用非线性,否则这仅相当于一层,但具有更多参数。