# [기술] Batch/Epoch

안규원·2024년 6월 15일

AI

목록 보기
12/22

[Batch]


학습데이터를 한번에 신경망에 통과시키면 모든 학습 데이터를 사용해 파라미터를 업데이트하면 리소스 사용에 있어 비효율적이고 학습 시간이 오래 걸린다. 메모리가 부족해진다.

+---------------------------+
| 전체 데이터셋(100%) |
+---------------------------+
| 모델 학습 |
+---------------------------+

따라서 전체 데이터셋을 여러 작은 그룹으로 나누어 Mini-batch 방법을 사용하는 것이 딥러닝 학습에 있어 일반적이며, 이때 batch size는 하나의 소그룹에 속하는 데이터 수를 의미한다.

+---------------------------+
| 데이터셋(100%) |
| +-----------+-----------+|
| | 미니배치1 | 미니배치2 | ... |
| +-----------+-----------+|
| 모델 학습 |
+---------------------------+

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 가상의 데이터 생성
X = torch.randn(1000, 20)  # 1000개의 샘플, 각 샘플은 20개의 특성
y = torch.randint(0, 2, (1000,))  # 1000개의 타겟 레이블 (0 또는 1)

# 데이터셋과 데이터로더 생성
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 간단한 신경망 모델 정의
model = nn.Sequential(
    nn.Linear(20, 50), # 선형레이어
    nn.ReLU(), # ReLU활성화함수 레이어
    nn.Linear(50, 1), # 선형레이어
    nn.Sigmoid() # Sigmoid활성화함수 레이어
)

# 손실 함수와 옵티마이저 설정
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 학습 루프
num_epochs = 10
for epoch in range(num_epochs):
    for batch_X, batch_y in dataloader:
        optimizer.zero_grad()
        outputs = model(batch_X)
        loss = criterion(outputs.squeeze(), batch_y.float())
        loss.backward()
        optimizer.step()
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

[Epoch]


전체 데이터셋이 모델을 한 번 완전히 통과한 것을 의미한다. epoch를 늘려 모델이 데이터셋을 여러 번 학습할 수 있도록 하는 것이 일반적이다.

너무 많은 에포크를 사용하면 모델이 overfitting될 수 있으며, 실험을 통해 적절한 에포크 수를 설정하여 모델의 학습을 조절한다.

+---------------------------+
| 에포크 1 |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
| |
| 에포크 2 |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
| |
| ... |
| |
| 에포크 N |
| +-----------------------+|
| | 데이터셋(100%) |
| +-----------------------+|
+---------------------------+

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

# 가상의 데이터 생성
X = np.random.randn(1000, 20)  # 1000개의 샘플, 각 샘플은 20개의 특성
y = np.random.randint(0, 2, 1000)  # 1000개의 타겟 레이블 (0 또는 1)

# 간단한 신경망 모델 정의
model = Sequential([
    Dense(50, activation='relu', input_shape=(20,)),
    Dense(1, activation='sigmoid')
])

# 컴파일
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])

# 학습 (에포크 기반)
num_epochs = 10
model.fit(X, y, epochs=num_epochs, batch_size=32)

0개의 댓글