[머신러닝 실습] Linear Regression(선형 회귀) with PyTorch
이 글은 PyTorchZeroToAll을 기반으로 작성한 글입니다.
[머신러닝 이론] Multiple Linear Regression(다중 선형 회귀)
이 글은 모두를 위한 딥러닝 시즌1을 기반으로 작성한 글입니다. [머신러닝 이론] Gradient descent(경사하강법) 이 글은 모두를 위한 딥러닝 시즌1을 기반으로 작성한 글입니다. [머신러닝 이론] Linear
chaerrylog.tistory.com
앞에서 선형 회귀에 대해서 알아봤다. 이 내용들을 종합해 파이토치를 사용해 실습을 진행한다.
import torch
from torch import nn
from torch import tensor
torch를 import한다.
PyTorch를 통해 신경망을 만들기 위해 torch.nn 패키지를 import한다. 신경망은 데이터에 대한 연산을 수행하는 layer와 module로 구성되어 있다.
모델의 입출력과 모델의 매개변수를 Encode하기 위해 torch.tensor를 import한다. tensor는 array나 matrix와 매우 유사한 특수한 자료구조이다.
x_data = tensor([[1.0], [2.0], [3.0]])
y_data = tensor([[2.0], [4.0], [6.0]])
x_data와 y_data에 tensor() 함수를 사용해 입력된 데이터를 복사하여 tensor로 변환하여 저장한다.
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
torch.nn.Module은 PyTorch의 모든 뉴럴 네트워크 모듈의 기본 클래스이다. 일반적인 모델들은 이 클래스를 상속받아야 한다.
super(Model, self).__init__()로 부모 클래스를 초기화해줘서 부모 클래스의 속성을 하위 class가 받아오도록 한다.
torch.nn.Linear()은 저장된 weight와 bias를 사용하여 입력에 linear transformation을 적용하는 모듈이다. 괄호 안에 입력되는 x의 차원과 출력되는 y의 차원을 입력한다. (1, 1)은 하나의 입력에 대해 하나의 출력이 나온다는 것이다.
forward() 함수는 위에서 정한 self.linear로 정의한 레이어의 순전파 동작이 자동으로 수행되게 한다.
model = Model()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
model에 위에서 만든 Model()을 넣어준다.
torch.nn.MSELoss는 Mean Squared Error 손실 함수를 구현한 PyTorch의 클래스이다.
reduction은 손실 값을 어떻게 줄일지 지정하는 인수이다. 우리는 sum을 사용한다.
torch.optim.SGD는 확률적 경사 하강법(Stochastic Gradient Descent) 최적화 알고리즘을 구현한 PyTorch의 클래스이다. SGD는 각 업데이트 스텝마다 무작위로 선택된 미니 배치에 대한 손실 함수의 기울기를 사용하여 모델을 업데이트한다.
model.parameters()는 모델의 학습 가능한 파라미터들을 반환한다. lr은 학습률을 지정하는 인수이다.
for epoch in range(500):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(f'Epoch: {epoch} | Loss: {loss.item()} ')
optimizer.zero_grad()
loss.backward()
optimizer.step()
500번 모델을 학습한다.
x_data를 모델에 넣어 y값을 예측한다.
예측값과 실제값을 loss 함수에 넣어 loss 값을 계산하고 출력한다. 이 때 .item() 을 사용하여 python scalar 값을 얻는다.
optimizer.zero_grad()를 통해 변화된 기울기 값을 초기화한다.
loss.backward()를 통해 기울기를 계산한다.
optimizer.step()을 통해 기울기를 업데이트한다.
hour_var = tensor([[4.0]])
y_pred = model(hour_var)
print("Prediction (after training)", 4, model(hour_var).data[0][0].item())
tensor() 함수를 사용해 4.0을 tensor로 변환한다.
학습된 model()에 4.0을 넣어 예측값을 계산하고 출력한다. 이 때 .item() 을 사용하여 python scalar 값을 얻는다.
<reference>
1. https://tutorials.pytorch.kr/beginner/basics/intro.html
2. https://wikidocs.net/156984
3. https://076923.github.io/posts/Python-pytorch-2/
4. https://daebaq27.tistory.com/60
5. https://m.blog.naver.com/fbfbf1/222480437930
6. https://david-kim2028.tistory.com/entry/Linear-Regression-Pytorch-로-구현하기