오늘은 데이터 여러개를 하나로 묶어보고, loss함수를 시각화 해본다.
1.Dataset/DataLoader로 mini-batch 실습
mini-batch란
전체 데이터셋을 작은 덩어리(batch) 로 쪼개서 학습에 쓰는 데이터 묶음 단위
[전체 데이터] → [[샘플 1~4], [샘플 5~8], [샘플 9~12], ...]
for x_batch, y_batch in dataloader:
# batch 단위로 순전파 → 손실 → 역전파 → 파라미터 업데이트
여기서 한 batch에 위에 샘플1~4 이렇게 한 덩어리가 들어감
mini-batch를 사용하는 이유
전체 데이터 한 번에 학습하면? (Batch Gradient Descent) -> 데이터가 작으면 상관없는데, 데이터가 커지면 메모리 터지고 속도도 느림
한 샘플씩 학습하면? (Stochastic Gradient Descent) -> 속도는 빠르고 메모리도 적게 쓰지만, 업데이트가 너무 자주 일어나서 진동이 심하고 수렴이 불안정함
mini-batch는 중간 타협 같은 것
데이터를 여러 개씩(예: batch size=16, 32, 64) 묶어서 처리
메모리 효율성 확보 + GPU 병렬 처리 가능 + SGD 진동 문제 완화 → 안정적이고 빠름
-> 메모리 효율 + 속도 + 안정성 3개를 동시에 잡을 수 있음
차원 등 데이터 관련 정리
1.x,y값
x = [[1.0], [2.0], [3.0]] -> (3,1) batch_size(샘플 수)=3,input_dim(특성 수)=1 -> 2차원
y = [[2.0], [4.0], [6.0]] -> (3,1) batch_size=3,output_dim=1 -> 2차원
2.x,y를 쌍으로 하나씩 묶기(dataset = TensorDataset(x, y))
샘플1: ( [1.0], [2.0] ) -> (2,1)이 아니라 (1,) 즉 1차원 2개임(특성 자)
샘플2: ( [2.0], [4.0] )
샘플3: ( [3.0], [6.0] )
3.dataloader로 샘플을 묶기(dataloader = DataLoader(dataset, batch_size=2, shuffle=True))
1 epoch 안에서:
Batch 1: ( [1.0], [2.0] ), ( [2.0], [4.0] )
Batch 2: ( [3.0], [6.0] )
만약 batch_size=3이었다면
Batch 1: ( [1.0], [2.0] ), ( [2.0], [4.0] ), ( [3.0], [6.0] )
흐름
1.import
2.데이터셋
3.TensorDataset으로 x,y묶고, DataLoader로 mini-batch설정
4.모델설정 및 생성
5.옵티마이저
6.반복문
6-1.dataloader에서 x,y각각 불러옴
6-2.예측
6-3.손실함수
6-4.역전파
6-5.파라미터 업데이트(옵티마이저)
6-6.기울기 초기화(옵티마이저)
6-7.출력
코드
#1.import
import torch
from torch.utils.data import TensorDataset, DataLoader
import torch.nn as nn
#2.데이터셋
x = torch.tensor([[1.0],[2.0],[3.0]])
y_true = torch.tensor([[2.0],[4.0],[6.0]])
#3.TensorDataset로 x,y믂고 DataLoader로 mini-batch생성
tensordataset = TensorDataset(x,y_true)
dataloader = DataLoader(tensordataset,batch_size=2,shuffle=True)
#4.모델 구현 및 생성
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.w = nn.Parameter(torch.tensor([[0.1]]))
self.b = nn.Parameter(torch.tensor([0.0]))
def forward(self,x):
return x @ self.w + self.b
model = LinearRegressionModel()
#5.옵티마이저 생성
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
#6.반복문
for epoch in range(20):
#6-1.dataloader에서 x,y각각 불러오기
for batch_x,batch_y in dataloader:
#6-2.예측
y_pred = model(batch_x)
#6-3.손실함수
loss=torch.mean((y_pred - batch_y) ** 2)
#6-4.역전파(기울기)
loss.backward()
#6-5.파라미터 갱신(옵티마이저)
optimizer.step()
#6-6.기울기 초기화
optimizer.zero_grad()
#6-7.출력
print(f"epoch:{epoch+1:2d} | w:{model.w.item():.4f} | b:{model.b.item():.4f} | loss:{loss.item():.4f}")
결과
epoch: 1 | w:2.0000 | b:0.7600 | loss:18.0500
epoch: 1 | w:1.6960 | b:0.6080 | loss:0.5776
epoch: 2 | w:1.7872 | b:0.6384 | loss:0.0462
epoch: 2 | w:1.7021 | b:0.5533 | loss:0.1811
epoch: 3 | w:1.6851 | b:0.5320 | loss:0.0335
epoch: 3 | w:1.9328 | b:0.6146 | loss:0.1704
epoch: 4 | w:1.7542 | b:0.5186 | loss:0.2350
epoch: 4 | w:1.7434 | b:0.5132 | loss:0.0007
epoch: 5 | w:1.8204 | b:0.5388 | loss:0.0329
epoch: 5 | w:1.7485 | b:0.4670 | loss:0.1290
epoch: 6 | w:1.8419 | b:0.4993 | loss:0.0419
epoch: 6 | w:1.7737 | b:0.4311 | loss:0.1165
epoch: 7 | w:1.8276 | b:0.4354 | loss:0.0517
epoch: 7 | w:1.7914 | b:0.4173 | loss:0.0082
epoch: 8 | w:1.8540 | b:0.4381 | loss:0.0218
epoch: 8 | w:1.7955 | b:0.3797 | loss:0.0853
epoch: 9 | w:1.7839 | b:0.3651 | loss:0.0158
epoch: 9 | w:1.9538 | b:0.4218 | loss:0.0803
epoch:10 | w:1.8504 | b:0.3513 | loss:0.1248
epoch:10 | w:1.9089 | b:0.3708 | loss:0.0095
batch가 2개라 1 Epoch 안에서 2번 업데이트 됨 -> 같은 epoch가 2번 표시됨
2.그래프 시각화(loss함수)
matplotlib란?
파이썬에서 데이터 그래프 그려주는 시각화 라이브러리
코드
주석중에 앞에 숫자 없는 것은 그래프 시각화를 위한 코드임
import torch
from torch.utils.data import TensorDataset, DataLoader
import torch.nn as nn
#matplotlib 라이브러리 import하기
import matplotlib.pyplot as plt
x = torch.tensor([[1.0],[2.0],[3.0]])
y_true = torch.tensor([[2.0],[4.0],[6.0]])
tensordataset = TensorDataset(x,y_true)
dataloader = DataLoader(tensordataset,batch_size=2,shuffle=True)
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.w = nn.Parameter(torch.tensor([[0.1]]))
self.b = nn.Parameter(torch.tensor([0.0]))
def forward(self,x):
return x @ self.w + self.b
model = LinearRegressionModel()
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
#Epoch별 평균 loss 저장할 리스트
loss_list = []
for epoch in range(10):
#한 Epoch 동안의 누적 loss(2번의 loss의 합)
epoch_loss = 0
for batch_x,batch_y in dataloader:
y_pred = model(batch_x)
loss=torch.mean((y_pred - batch_y) ** 2)
loss.backward()
optimizer.step()
optimizer.zero_grad()
#batch별 loss를 누적
epoch_loss += loss.item()
#epoch별 loss 평균
avg_loss = epoch_loss / len(dataloader)
#list에 추가
loss_list.append(avg_loss)
#6-7.avg_loss 출력
print(f"epoch:{epoch+1:2d} | w:{model.w.item():.4f} | b:{model.b.item():.4f} | loss:{avg_loss:.4f}")
#그래프그리기
plt.plot(range(1,len(loss_list)+1),loss_list) #X축 = Epoch 번호, Y축 = Loss 값들
plt.xlabel('Epoch') #x축 이름
plt.ylabel('Loss') #y축 이름
plt.title('Training Loss Curve') #제목
plt.grid() #격자표기
plt.show() #그래프 창 띄움
이렇게 하면 epoch가 2번 표시되는 것도 없애줄 수 있음
결과
epoch: 1 | w:2.2660 | b:0.6460 | loss:12.8877
epoch: 2 | w:1.7864 | b:0.3861 | loss:0.5873
epoch: 3 | w:1.8114 | b:0.3772 | loss:0.0273
epoch: 4 | w:1.8189 | b:0.3621 | loss:0.0206
epoch: 5 | w:1.9529 | b:0.3947 | loss:0.0403
epoch: 6 | w:1.8346 | b:0.3308 | loss:0.0465
epoch: 7 | w:1.8379 | b:0.3011 | loss:0.0337
epoch: 8 | w:1.9634 | b:0.3344 | loss:0.0302
epoch: 9 | w:1.9278 | b:0.2940 | loss:0.0422
epoch:10 | w:1.8709 | b:0.2583 | loss:0.0142

matplotlib를 사용하였기 때문에 그래프 창이 뜸. 반복횟수가 늘어날수록 loss가 줄어드는 것을 가시적으로 확인할 수 있음.
'ai' 카테고리의 다른 글
| pytorch-Day3 : 단층 퍼셉트론에서 비선형 문제를 완벽하게 풀수 없음을 증명 (3) | 2025.07.30 |
|---|---|
| pytorch-Day5 : MLP로 MNIST 손글씨 분류 – 전체 학습 흐름 구현 (1 Epoch) (1) | 2025.07.28 |
| pytorch-Day4 : XOR 문제를 해결하는데 사용한 MLP코드에서 파라미터를 변경하며 정확도 올려보기 + MNIST Dataset 다운로드 & 로딩 테스트 (2) | 2025.07.11 |
| pytorch-Day2 : Cutom Dataset 만들기, batch size 바꿔가며 학습곡선 비교 (1) | 2025.07.10 |
| pytorch-Day0 (0) | 2025.07.09 |