Pytorch - это правильный способ загрузить большой набор данных с помощью pytorch.data.Dataset и обучить его линейной регрессии - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок в PyTorch и в настоящее время работаю с историческим набором метеорологических данных и создал итераторы PyTorch DataLoader и успешно разбил данные на поезд и тестовый набор.

Я хочу запустить простую модель линейной регрессии на этих данных, чтобы предсказать столбец ["Temperature (C)"].Я не занимаюсь проектированием объектов, а просто использую все dtypes с плавающей точкой в ​​качестве объектов.

При запуске модели (просто полностью связанный слой со смещением True - Linear Regression) я вижу уменьшение потерьв первых двух партиях или около того, а затем потери просто колеблются около (100 +- 25).Когда я нормализую функции, потери уменьшаются в первой партии, но колебания составляют около 200 +- 25.

Из того, что я узнал, я знаю, что после нормализации функций SGD имеет более высокий шанс сойтись быстрее,Но есть разница в базовой потере т.е.без нормализации функций ~ 100 , с нормализацией / масштабированием функций ~ 200 .

Мне кажется, что я где-то реализовал что-то не так, но не получил ничеголинии, чтобы выяснить, что я испортил или это даже нормальное поведение.

[Обновление] Вот как мой график функции потерь смотрит через спуск.Но я замечаю, что потери слишком велики.Я ошибся ? Потеря в зависимости от количества итераций. График X-ось - количество итераций для 100 размеров пакета;ось у - потеря

Вот мой код

import pandas as pd
import numpy as np
import torch
from torch.utils.data import DataLoader, Dataset, random_split
from sklearn.preprocessing import StandardScaler

import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.optim import SGD

class LinearRegression(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LinearRegression, self).__init__()
        self.fc1 = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        output = self.fc1(x)
        return output

class LoaderWeather(Dataset):
    def __init__(self, file_path, transform=None):
        self.file_path = file_path
        self.transform = transform
        # self.scaler = StandardScaler()

        self.data = pd.read_csv(self.file_path)
        self.data = self.data.loc[:, self.data.dtypes == np.float64]

        self.outputs = self.data["Temperature (C)"]
        self.inputs = self.data.drop(["Apparent Temperature (C)", "Temperature (C)"], axis=1)

        self.outputs = np.array(self.outputs).reshape(-1,1)
        self.inputs = np.array(self.inputs)

        # self.inputs = self.scaler.fit_transform(np.array(self.inputs))

        #Normalize data
        # self.means = self.inputs.mean(axis=1).reshape(-1,1)
        # self.stds = self.inputs.std(axis=1).reshape(-1,1)
        # self.inputs = (self.inputs - self.means)/self.stds

    def __getitem__(self, idx):
        return self.inputs[idx], self.outputs[idx]

    def __len__(self):
        return len(self.inputs)

def train_epoch(epoch, train_loader, regression_model, criterion, optimizer):

        print(epoch)
        train_loader = iter(train_loader)
        #Convert to tensors
        for iteration, (inputs, outputs) in enumerate(train_loader):
            # inputs,outputs = train_loader.next()


            inputs = Variable(torch.tensor(inputs).type(torch.FloatTensor))
            outputs = Variable(torch.tensor(outputs).type(torch.FloatTensor))

            #Clear the gradients w.r.t the parameters
            optimizer.zero_grad()

            #Forward pass
            predicted = regression_model(inputs) 

            #Calculate loss
            loss = criterion(predicted, outputs)

            #Backpropogate gradient of loss
            loss.backward()

            #Perform one step of gradient descent
            optimizer.step()

            #Verbosity
            if iteration % 100 == 0:
                print("epochs :{}, loss :{} , iteration: {},".format(epoch, loss, iteration))

        return regression_model, loss


def main():

 ############################################   
    #Hyper parameters
    batch_size=100
    n_iters = 20000
    learning_rate=0.0000001
#############################################

    weather_data = LoaderWeather("data/weatherHistory.csv")

    n = len(weather_data)
    n_train = int(0.8 * len(weather_data))
    n_test = n - n_train

    train, test = random_split(weather_data, lengths=[n_train, n_test])



    train_loader = DataLoader(train, batch_size=batch_size, shuffle=True, num_workers=4)
    test_loader = DataLoader(test, batch_size=batch_size, num_workers=4)



    input_dim = 6
    output_dim = 1

    regression_model = LinearRegression(input_dim, output_dim)
    criterion = nn.MSELoss()

    optimizer = SGD(regression_model.parameters(), lr=learning_rate)


    no_of_batches = np.floor(n/batch_size)

    print(no_of_batches)
    epochs = int(n_iters/no_of_batches)

    print("Total epochs : {}".format(epochs))

    for epoch in range(epochs):
        regression_model, loss = train_epoch(epoch, train_loader, regression_model, criterion, optimizer)


    print(regression_model, loss)   
    print(regression_model.parameters())
if __name__ == '__main__':
    main()

Любая помощь будет принята с благодарностью.Кроме того, пожалуйста, дайте мне знать, если я хорошо тренируюсь или что-то здесь не так.

Спасибо

1 Ответ

0 голосов
/ 24 декабря 2018

Может быть полезно построить норму градиента (с линейным регистром это не должно быть слишком сложно).Если градиент мал, то дисперсия ошибки обусловлена ​​стохастическими эффектами, тогда как, если норма не мала, возможно, имеется некоторая программная ошибка.Некоторые общие приемы для уменьшения дисперсии после достижения области конвергенции - это снижение скорости обучения (см. https://www.tensorflow.org/api_docs/python/tf/train/exponential_decay), или увеличение размера пакета. Все это действительно зависит от уровня точности, которого вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...