我想在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个时间步长的数据?
我很难在网上理解这些材料。最后一层必须是什么?
答案 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)
我还要注意,如果在隐藏状态下进行编码后必须具有两个完全连接的层,则应在两者之间使用非线性,否则这仅相当于一层,但具有更多参数。