안녕하세요. 지난 글에서 PyTorch의 순전파 → 손실 계산 → 역전파 기본 원리를 다뤘습니다.
https://roquen4145.tistory.com/318
Pytorch와 함께 머신러닝 맛보기
안녕하세요 이번에는 pytorch를 이용해서 머신러닝을 하는 방법에 대해서 정리해보려고 합니다.pytorch는 최근 머신러닝을 하는 사람들이 많이 사용하는 프레임워크입니다. 머신러닝은 크게 세가
roquen4145.tistory.com
이번 글에서는 실제 데이터를 만들어서 학습하는 과정을 살펴보고
손실 추이와 모델 성능을 시각화해보겠습니다.
데이터 준비
머신러닝의 첫 단계는 학습할 데이터를 준비하는 것입니다.
여기서는 선형 회귀 예제로, 간단한 1차 함수 y = 2x + 1 형태의 데이터를 생성해보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
import torch
# 간단한 데이터 예제: y = 2x + 1
X = np.linspace(-1, 1, 100)
y = 2 * X + 1
# 노이즈 추가
torch.manual_seed(4145)
np.random.seed(4145)
noise = np.random.normal(0, 0.1, X.shape)
y = y + noise
plt.scatter(X, y, color='blue', label='Data points')
위와 같이 y = 2x + 1 근처에 데이터들이 생성되었습니다.
이제 학습할 준비를 해보겠습니다
# PyTorch 텐서로 변환
X_tensor = torch.tensor(X, dtype=torch.float32).view(-1, 1)
y_tensor = torch.tensor(y, dtype=torch.float32).view(-1, 1)
# 가중치와 편향 초기화
w = torch.randn(1, requires_grad=True, dtype=torch.float32)
b = torch.randn(1, requires_grad=True, dtype=torch.float32)
lr = 0.1
losses = []
이전과 다르게 X, y값들이 텐서로 선언이 안되었기 때문에 Tensor로 만들고 시작합니다.
또한 w,b를 이전에는 단순히 1로 선언했다면 이번엔 랜덤 값 하나로 초기화를 했습니다.
requires_grad는 이전 게시물에서 설명한 것과 같이 torch 라이브러리에서 기울기 계산을 해주기 위해 설정했습니다.
lr은 learning rate의 줄임말로 한번 학습할 때마다 얼마나 학습한 내용을 반영할 지에 대한 값을 나타냅니다.
다음은 학습루프입니다.
for epoch in range(30):
# 순전파
y_pred = w * X_tensor + b
# 손실 계산 (MSE)
loss = torch.mean((y_pred - y_tensor) ** 2)
losses.append(loss.item())
# 역전파
loss.backward()
# 파라미터 수동 업데이트
with torch.no_grad():
w -= lr * w.grad
b -= lr * b.grad
# 기울기 초기화
w.grad.zero_()
b.grad.zero_()
# 10 에폭마다 시각화
if epoch % 10 == 0 or epoch == 29:
plt.figure(figsize=(10, 3))
plt.subplot(1, 2, 1)
plt.scatter(X, y, label='True')
plt.plot(X, y_pred.detach().numpy(), color='r', label='Predicted')
plt.title(f'Epoch {epoch}')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(losses)
plt.title('Loss over epochs')
plt.xlabel('Epoch')
plt.ylabel('MSE Loss')
plt.tight_layout()
plt.show()
plt.close()
코드에서 파라미터 수동 업데이트 쪽을 보면 w.grad, b.grad를 볼 수 있는데
위에서 설정한 requires_grad 옵션으로 계산된 값을 사용하는 부분입니다.
with torch.no_grad(): 구문은 아래 내용을 계산할 때는 기울기 계산에 반영하지 말라는 뜻입니다.
아래는 실행 결과입니다.
그래프를 보면 손실값이 제대로 줄어들면서 데이터에 근사하게 모델 예측값이 나오고 있는 것을 볼 수 있습니다.
이렇게 학습루프를 만들어서 지난 시간에 배웠던 머신러닝의 세 단계를 구현해보았습니다.
다음 포스트에서는 머신러닝 모델을 만들어보도록 하겠습니다.
감사합니다.
'학습 > 머신러닝' 카테고리의 다른 글
Pytorch와 함께 머신러닝 맛보기 (0) | 2025.05.21 |
---|---|
Jupyter notebook 사용법과 단축키 (0) | 2025.05.19 |
머신러닝 찍먹하기 (0) | 2024.11.08 |
머신러닝 공부를 위한 링크 모음 (2) | 2017.08.08 |
[머신러닝] TensorFlow 설치 (0) | 2017.07.18 |