深度学习的多变量和多目标回归问题

时间:2019-06-01 16:08:56

标签: python neural-network deep-learning regression pytorch

我想设计一个具有多个输入变量(4)和多个输出(3)的神经网络模型。不知道在哪里改进。 可能的问题:

  1. 数据加载器和数据规范化:

    • 我发现我的输入数据具有4个3〜4位数字值,因此进行了归一化。我不确定我的方法是否正确。
    • 并且我也对输入值进行了归一化,尽管输出值也有很多数字,但希望正确地预测输出值是什么。
  2. 自行建模:

    • 我正在尝试构建多个输入和多个输出模型 所以我把4个输入变量,并得到3个输出变量。 我应该如何改善我的模型? (感谢您的帮助,但是,仅使用CNN,RNN,LSTM ...并没有真正的帮助。)
  3. 损失函数和优化器

    • 当前使用nn.MSELoss()损失函数和torch.optim.SGD(model.parameters(),lr = learning_rate)优化器。
    • 但是,这会使NaN,NaN,NaN输出(可能有些数字太大了吗?) 并尝试了nn.L1Loss()
    • Loss.item值显着降低,但不确定这是否是我想要的值。
    • 我发现结果没有太大变化(学习过程)
  4. 评估指标

    • 似乎我无法绘制预测和y,因为它是3d向量 如果数字匹配,我将无法执行,因为数字通常在许多小数点都不匹配。
    • 在这种情况下我应该如何进行评估?
  5. 任何其他提示或帮助将非常有帮助。 预先谢谢你

#This is a dataloader that I have and did normalization with f.normalize
class Loader(Dataset):

    def __init__(self, data):
      self.data = data
      // without normalization process
      //self.features = torch.tensor(data.iloc[:, 1:4].values)
      // with normalization process
      self.features = f.normalize(torch.tensor(data.iloc[:, 1:5].values), p=2, dim=[-2,1])
      self.targets = torch.tensor(data.iloc[:, 5:8].values)

    def __getitem__(self, index):
      feature = self.features[index]
      target = self.targets[index]
      return feature, target

    def __len__(self):
      return self.data.shape[0]
# model
class MultivariateLinearRegressionModel(nn.Module):
  def __init__(self):
    super().__init__()
    self.linear = nn.Linear(4, 3)

  def forward(self, x):
    return self.linear(x)
# main codes to run training
trainset = Loader(data=training_data)
train_loader = DataLoader(dataset = trainset,
                         batch_size=batch_size,
                         shuffle=False)

model = MultivariateLinearRegressionModel().to(device)
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
total_step = len(test_loader)
loss_list = []
for epoch in range(100):
    for i, (x, y) in enumerate(test_loader):
        x = x.to(device, dtype=torch.float)
        y = y.to(device, dtype=torch.float)
        # Forward pass

        prediction = model(x)
        loss = criterion(prediction, y)


        # Zero gradients, perform a backward pass, and update the weights.
        optimizer.zero_grad()
        loss.backward()
        optimizer.step() 

        if (i+1) % 1000 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))
            loss_list.append(loss.item())   

数据格式:归一化之前

tensor([[3671.4275, 3920.7729, 3562.8547, 3409.9354],
        [2613.0593, 4144.3052, 3963.4261, 2520.0331],
        [3217.1497, 4907.6748, 3618.3077, 1625.5708],
        [3495.5350, 3740.1072, 3372.8023, 3222.0030],
        [2668.3124, 4059.1723, 3856.5733, 2555.0729],
        [3148.7100, 3581.6413, 3238.2163, 2892.8446],
        [3259.0295, 4951.7812, 3691.3874, 1729.6103],
        [2383.1404, 4416.9705, 4282.0778, 2368.6338],
        [3233.4030, 3509.1483, 3131.9635, 2950.0310],
        [2796.2451, 4666.8626, 3963.1061, 2038.5555]], device='cuda:0',
       dtype=torch.float64)
tensor([[  86.8043, -125.5781,  514.8793],
        [ 599.4942,  -25.5526,  869.6853],
        [ 767.3758, -575.2572,  932.4783],
        [  85.4733, -129.7880,  653.4727],
        [ 539.4341,  -38.1205,  870.6907],
        [ 150.6393, -117.4500,  877.1568],
        [ 766.7727, -558.0292,  871.3760],
        [ 806.4800,   11.9661,  873.6658],
        [  98.3526, -130.0950,  883.7505],
        [ 780.5635, -253.1192,  876.8691]], device='cuda:0',
       dtype=torch.float64)

数据格式:归一化后

tensor([[0.0063, 0.0069, 0.0061, 0.0058],
        [0.0067, 0.0072, 0.0065, 0.0062],
        [0.0064, 0.0070, 0.0062, 0.0059],
        [0.0056, 0.0092, 0.0077, 0.0039],
        [0.0051, 0.0081, 0.0078, 0.0049],
        [0.0058, 0.0074, 0.0068, 0.0054],
        [0.0054, 0.0078, 0.0073, 0.0051],
        [0.0063, 0.0097, 0.0073, 0.0034],
        [0.0047, 0.0087, 0.0084, 0.0046],
        [0.0058, 0.0093, 0.0076, 0.0038]], device='cuda:0',
       dtype=torch.float64)
tensor([[  98.2855, -130.0667,  883.9658],
        [  86.6183, -130.0066,  716.1242],
        [  93.5488, -130.8305,  837.4871],
        [ 778.3415, -295.5290,  876.0615],
        [ 598.6805,  -25.7674,  869.6824],
        [ 322.8932,  -82.1197,  873.7214],
        [ 473.1678,  -51.6608,  871.5651],
        [ 768.4887, -535.2723,  871.2855],
        [ 806.6830,    6.9960,  877.1038],
        [ 775.0177, -365.2128,  875.5223]], device='cuda:0',
       dtype=torch.float64)
# Result
Epoch [1/100], Step [1000/5500], Loss: 320.4197
Epoch [1/100], Step [2000/5500], Loss: 262.3183
Epoch [1/100], Step [3000/5500], Loss: 220.1559
Epoch [1/100], Step [4000/5500], Loss: 236.1293
Epoch [1/100], Step [5000/5500], Loss: 34.1634
Epoch [2/100], Step [1000/5500], Loss: 440.7753
Epoch [2/100], Step [2000/5500], Loss: 494.4890
Epoch [2/100], Step [3000/5500], Loss: 224.8119
Epoch [2/100], Step [4000/5500], Loss: 145.8345
Epoch [2/100], Step [5000/5500], Loss: 97.7785

0 个答案:

没有答案