Я новичок в 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()
Любая помощь будет принята с благодарностью.Кроме того, пожалуйста, дайте мне знать, если я хорошо тренируюсь или что-то здесь не так.
Спасибо