DataLoader — sample을 모아서 배치로 만들어 주는 도구 ★★★
DataLoader는 Dataset에서 sample을 꺼내 지정한 크기의 배치로 묶어서 하나씩 건네주는 도구예요. 교수님이 먼저 for 문으로 직접 sample을 모아 torch.stack으로 쌓아 보여 준 뒤, "이 일을 DataLoader가 대신 해 주니 걱정할 필요 없다"고 했어요.
학생(sample)이 줄을 서 있고, 배식 담당(DataLoader)이 4명씩 묶어서 식당으로 들여보내요. 마지막에 2명이 남으면 그 2명이 마지막 묶음이 되고요. 줄을 매번 새로 섞을지(shuffle)도 담당이 정해요.
| 옵션 | 역할 | 기본값 |
|---|---|---|
batch_size | 한 배치에 넣을 sample 수 | 1 |
shuffle | 순회할 때마다 sample 순서를 섞을지 | False |
drop_last | 배치 크기보다 모자란 마지막 배치를 버릴지 | False |
| 코드 줄 | 무슨 뜻 |
|---|---|
DataLoader(dataset, batch_size=4, ...) | dataset에서 4개씩 묶어서 꺼내 주는 도구를 만들어요. |
len(dataset) | sample 수 = 10 |
len(loader) | 배치 수 = 3 (4개, 4개, 2개) |
for batch_x, batch_y in loader: | 배치를 하나씩 꺼내요. 한 번 꺼낼 때마다 입력 묶음과 정답 묶음이 짝으로 나와요. |
enumerate(loader) | 번호 i를 0, 1, 2로 같이 붙여 줘요. |
tuple(batch_x.shape) | 배치의 입력 크기예요. (4, 2)는 sample 4개, 특성 2개예요. |
batch_y.flatten().tolist() | (4, 1) 모양의 정답을 일렬로 펴서 파이썬 리스트로 바꿔요. |
마지막 배치의 x는 [[16, 17], [18, 19]]이에요. 이 for 문을 끝까지 한 번 돌면 전체 데이터를 한 바퀴 돈 것이라서 1 epoch이에요.
교수님이 던진 질문도 정리해 볼게요. "dataset[0]과 next(iter(loader))는 무엇이 다른가요?"
| 구분 | 무엇이 나오나 | x, y 크기 |
|---|---|---|
dataset[0] | sample 하나 | (2,) , (1,) |
next(iter(loader)) | 첫 번째 배치(sample 4개 묶음) | (4, 2) , (4, 1) |
배치의 크기는 맨 앞에 배치 크기가 붙는 모양이에요. sample 하나의 (2,)가 4개 쌓이면 (4, 2)가 돼요. 이것이 5장에서 모델에 넣던 "배치 4개, 특성 2개" 입력이에요.
len(dataset)은 sample 수, len(loader)는 배치 수예요. 둘을 섞어 쓴 보기(예 "10 10")는 오답이에요. batch_size=4이면 한 배치 x의 크기는 (4, 특성 수)이고 마지막 배치만 작을 수 있어요.
잠깐 확인 — DataLoader를 for 문으로 한 번 끝까지 돌면 무엇이 한 번 끝난 건가요?
1 epoch이에요. 모든 sample을 한 번씩 사용했으니까요. 이때 for 문이 도는 횟수는 배치 수(len(loader))와 같아요.
자료: 7주차 · Week05_Dataset_DataLoader_Train_Validation(part1) · 7주차 녹취(빅데이터07)