이 포스트는 Github 접속 제약이 있을 경우를 위한 것이며, 아래와 동일 내용을 실행 결과와 함께 Jupyter notebook으로도 보실 수 있습니다.
You can also see the following as Jupyter notebook along with execution result screens if you have no trouble connecting to the Github.
Model Coding 기본 구조
- 구조 예) Linear Regression
- Regression Analysis(회귀분석) : 독립변수와 종속변수 사이에 인과관계가 존재할 때 그 관계의 통계적 유의미성을 검증하고, 또 그 관계의 정도를 분석하는 것
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader
Dataset은 아래 두 가지로 구성 가능
- 입력 Data가 torch.FloatTensor 인 경우
- 일반 행렬 Data를 pytorch의 Tensor로 변환해야 하는 경우
(** import 함수가 다르며, 아래는 1, 2번 중 하나 진행)
#1
from torch.utils.data import TensorDataset
x_trains = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_trains = torch.FloatTensor([[152], [185], [180], [196], [142]])
dataset = TensorDataset(x_trains, y_trains)
#2
from torch.utils.data import Dataset
class CustomDataset(Dataset):
def __init__(self):
self.x_data = [[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]]
self.y_data = [[152], [185], [180], [196], [142]]
def __len__(self):
return len(self.x_data)
def __getitem__(self, idx):
x = torch.FloatTensor(self.x_data[idx])
y = torch.FloatTensor(self.y_data[idx])
return x, y
dataset = CustomDataset()
Model 정의 방법
본 예시의 경우, model = nn.Linear(3,1)로 간단히 정의 가능하나, 향후 복잡한 문제 해결을 위해 class로 구현함
def __init__(self):
super().__init__()
self.linear = nn.Linear(3,1)
def forward(self, x):
return self.linear(x)
model = MultiVariateLinear()
optimizer = torch.optim.SGD(model.parameters(), lr = 1e-5)
Model 학습
nb_epochs = 200
for epoch in range(nb_epochs +1):
for batch_idx, samples in enumerate(dataloader):
# print(batch_idx) # enumerate 함수 작동을 보려면 주석 해제
# print(samples)
x_train, y_train = samples
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 50 == 0:
print('Epoch {:4d}/{} Batch{}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, batch_idx+1, len(dataloader), cost.item()
))
학습된 Model로 예측
new_var = torch.FloatTensor([[73, 80,75]])
pred_y = model(new_var)
print("훈련 후 입력이 73, 80, 75일 때의 예측값 :", pred_y)