Проблемы с множественной и множественной регрессией с глубоким обучением - PullRequest
1 голос
/ 01 июня 2019

Я хотел бы разработать модель нейронной сети, которая имеет несколько входных переменных (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, потому что это трехмерный вектор, а также не может выполнить простое сравнение на равенство, потому что числа обычно не совпадают во многих десятичных точках.
    • Как мне следует проводить оценку в таких обстоятельствах?
  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
...