Python/[코칭스터디 9기] 인공지능 AI 기초 다지기
[인공지능(AI) 기초 다지기] 5. 딥러닝 핵심 기초 (6)
김초송
2023. 3. 7. 18:28
4-2) Loading Data
- 복잡한 머신러닝 모델을 학습하려면 엄청난 양의 데이터가 필요
- 대부분 데이터셋은 수 십만 개의 데이터 제공
- 엄청난 양의 데이터를 한번에 학습시킬 수는 없음
너무 느리고, 하드웨어 과부하
-> 일부분의 데이터만 학습
- Minibatch Gradient Descent
- 전체 데이터를 균일하게 나눠서 학습
- 컴퓨터가 모든 데이터의 cost를 계산하지 않고 각 미니배치의 cost만 계산 후 gradient descent 실행
- 업데이트마다 계산할 cost 양이 적기 때문에 업데이트 주기가 짧아짐
- 전체 데이터를 쓰지 않기 때문에 잘못된 방향으로 업데이트 할 수도 있음
- PyTorch Dataset
- torch.utils.data.Dataset 상속
- 구현해야 하는 method
- __len__() : 데이터셋의 총 데이터 수
- __getitem__() : 해당 index의 입출력 데이터 반환
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()
- PyTorch.DataLoader
- torch.utils.data.DataLoader 사용
- batch_size
: 각 미니배치의 크기
통상적으로 2의 제곱수로 설정 - shuffle = True
: Epoch 마다 데이터를 섞어서 데이터가 학습되는 순서를 바꿈
항상 True 권장
from torch.utils.data import DataLoader
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
-Full Code
- gradient descent 부분은 바뀌지 않음
- 이중 for문으로 minibatch 구현
- enumerate(dataloader)
: minibatch 인덱스와 데이터 받음 - len(dataloader)
: 한 epoch 당 minibatch 개수
nb_epochs = 20
for epoch in range(nb_epochs + 1):
for batch_idx, samples in enumerate(dataloader):
x_train, y_train = samples
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format( epoch, nb_epochs, batch_idx+1, len(dataloader), cost.item()))