IT/Machine Learning
Pytorch Linear/MLP Regression 튜토리얼 (feat. sklearn diabetes datasets)
엘티엘
2023. 6. 13. 08:47
pytorch 로 sklearn 의 diabetes datasets 을 Regression 해보자. Linear와 MLP Regression 모델을 적용하며, 모델 외에 optimizer, loss function 등은 동일하게 사용하고자 했다.
공통함수 정의
- sklearn 의 load_diabetes 함수를 사용해 데이터 Load
- 데이터 tensor 변환
from sklearn import datasets
import pandas as pd
import numpy as np
import torch
from torch import nn
data = datasets.load_diabetes()
x = torch.from_numpy(data.data).float()
y = torch.from_numpy(data.target.reshape(-1, 1)).float()
- optimizer, loss function, train 함수 정의
- optimizer: SGD
- loss_fn: MSE
- train: epoch=10000
def get_optimizer(lr):
return torch.optim.SGD(model.parameters(), lr=lr)
def get_loss_fn():
return torch.nn.MSELoss()
def train(model, optimizer, loss):
epoches=100000
PRINT=5000
for e in range(epoches):
pred = model(x)
loss = loss_fn(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if e % PRINT == 0:
print(e, loss.item())
- 결과 시각화를 위한 plotting 함수 정의
import matplotlib.pyplot as plt
def plotting(title, pred, y):
plt.scatter(x=y.numpy(), y=pred.reshape(1, -1).detach().numpy())
plt.title(title)
plt.xlabel('y')
plt.ylabel('pred')
Lineare Regression
- nn.Linear 를 사용해서 모델을 정의
- train (lr=0.01)
- 마지막 epoch 의 loss 는 2881.43
model = nn.Linear(x.size(-1), 1)
loss = get_loss_fn()
optimizer = get_optimizer(0.01)
train(model, optimizer, loss)
- 결과 시각화
plotting("Linear Regression", pred, y)
MLP Regression
- nn.Sequential 을 사용해서 MLP Regression 모델을 정의
- 중간의 nn,Linear size 및 nn.ReLU 등은 임의로 선정
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self._stacked_model = nn.Sequential(
nn.Linear(x.size(-1), 50),
nn.ReLU(),
nn.Linear(50, 100),
nn.ReLU(),
nn.Linear(100, 25),
nn.ReLU(),
nn.Linear(25, 1)
)
def forward(self, x):
pred = self._stacked_model(x)
return pred
- lr(Learning Rate)이 너무 클 경우 loss 가 nan 으로 출력됨
- train (lr=0.0001)
- 마지막 epoch의 loss는 1.73
- Linear 에 비해 굉장히 낮은 값
- 다만, train/test 셋을 나눠서 측정한 결과가 아니기 때문에 큰 의미는 없음
- MLP의 특성상 overfitting
model = MyModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)
loss_fn = get_loss_fn()
train(model, optimizer, loss_fn)
- 결과 시각화
plotting("MLP Regression", pred, y)
반응형