当 LSTM 表现出更好的性能时,我可以像使用 FFNN 一样将 LSTM 用于非序列数据吗?

问题描述 投票:0回答:1

任务:
我正在使用深度学习模型进行回归任务。

数据:
我有一个大约有 100 万行的表格数据集。每行包含 59 个特征和一个因变量。它不是顺序数据,如时间序列或自然语言数据。

我尝试过的:
我知道前馈神经网络 (FFNN) 通常适合我的任务。循环神经网络 (RNN) 或长短期记忆 (LSTM) 网络通常用于顺序数据。

尽管如此,我还是尝试在非序列数据上使用 LSTM 模型,类似于使用 FFNN 的方式。与 FFNN 相比,LSTM 模型的损失 (RMSE) 要小得多(0.06 比 0.1)。较小的损失似乎并不是由于过度拟合,因为训练集和测试集上的损失非常接近。

问题:
那么,使用 LSTM 来完成这项任务是否合理?是否有任何研究或文献支持在回归任务中使用 LSTM 处理非序列数据?

这是 LSTM 的代码:

    X_train = tensor([[[ 1.4484,  0.7291,  0.6826,  ...,  0.0000,  0.0000,  0.0000]],
                      [[-1.1500,  0.4385,  0.8845,  ...,  0.0000,  0.0000,  0.0000]],
                      [[ 0.2358,  1.3103, -1.1840,  ...,  0.0000,  0.0000,  0.0000]],
                      ...,
                      [[-1.4964, -0.1426, -1.4673,  ...,  0.0000,  0.0000,  0.0000]],
                      [[-0.4571, -1.3049, -1.7294,  ...,  0.0000,  0.0000,  0.0000]],
                      [[ 1.6216, -1.3049, -1.9490,  ...,  0.0000,  0.0000,  0.0000]]])

    y_train = tensor([[[ 0.5081]],
                      [[ 0.9991]],
                      [[-0.2330]],
                      ...,
                      [[-0.1037]],
                      [[-0.3245]],
                      [[-0.6687]]])

    class LSTMNet(nn.Module):
        def __init__(self, input_size, hidden_size=128, num_layers=2):
            super(LSTMNet, self).__init__()
            self.hidden_size = hidden_size
            self.num_layers = num_layers
            self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
            self.fc = nn.Linear(hidden_size, 1)

        def forward(self, x):
            h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
            c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
            out, _ = self.lstm(x, (h0, c0))
            out = self.fc(out[:, -1, :]) 
            return out

    model = LSTMNet(X_train.shape[2]) 
    criterion = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    
    model.train()
    for data, target in train_loader:
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
deep-learning regression lstm recurrent-neural-network nonsequential
1个回答
0
投票

我也遇到了非顺序问题,但我正在研究时间序列分类。我使用 FFNN 获得了 64% 的准确率,而使用 LSTM 则获得了 90% 的准确率(所有验证/测试/训练都相同)。你知道为什么会出现这种情况吗?

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