Dataset — 입력과 정답을 한 쌍으로 묶은 명부 ★★
Dataset은 "번호를 말하면 그 번호의 (입력, 정답) 한 쌍을 꺼내 주는" 데이터 모음이에요. PyTorch의 torch.utils.data.Dataset 클래스를 상속해서 만들어요. 반드시 알아야 할 메서드가 세 개 있어요.
| 메서드 | 역할 | 이렇게 불려요 |
|---|---|---|
__init__(self, x, y) | 입력과 정답을 저장하고 개수가 같은지 확인 | MyDataset(x, y)로 만들 때 |
__len__(self) | 전체 sample 개수를 돌려줘요 | len(dataset) |
__getitem__(self, index) | 해당 번호의 (입력, 정답) 쌍을 돌려줘요 | dataset[3] |
출석 번호가 붙은 명부예요. "3번 학생"이라고 말하면(dataset[3]) 그 학생의 정보를 꺼내 주고, "전체 몇 명?"이라고 물으면(len(dataset)) 인원수를 알려 줘요. 번호는 0번부터 시작해요.
dataset[3]이라고 쓰면 파이썬이 내부에서 dataset.__getitem__(3)을 호출해요. len(dataset)은 dataset.__len__()을 호출하고요. 앞 장에서 배운 "f(x)가 __call__을 부른다"와 같은 원리예요. 교수님이 직접 만든 코드를 볼게요.
| 코드 줄 | 무슨 뜻 |
|---|---|
class MyDataset(Dataset): | Dataset을 물려받는 클래스를 만들어요. |
super().__init__() | 부모 준비 작업이에요. 모델 때와 똑같아요. |
if len(x) != len(y): raise ValueError | 입력과 정답 개수가 다르면 오류를 내요. 쌍이 안 맞으면 안 되니까요. |
self.x = x, self.y = y | 데이터를 객체 안에 저장해요. |
return len(self.x) | sample 개수는 x의 길이예요. |
return self.x[index], self.y[index] | 같은 번호의 입력과 정답을 짝지어 돌려줘요. |
toy_y = 2 * toy_x + 1 | 정답 y = 2x + 1. x = 0이면 y = 1, x = 3이면 y = 7이에요. |
custom_dataset[0] | 0번 sample (x = [0.], y = [1.])을 돌려줘요. 각각 크기가 (1,)예요. |
교수님은 직접 만들 수도 있지만 이미 만들어진 TensorDataset을 쓰면 된다고 했어요. 시험에서는 직접 만드는 코드보다 __len__과 __getitem__이 각각 무슨 일을 하는지를 이해하는 게 중요해요.
Dataset 설명 보기에서 맞는 것은 "__len__은 전체 sample 수를, __getitem__(index)는 해당 번호의 (입력, 정답) 쌍을 돌려준다"예요. dataset[3]은 네 번째 sample이에요(0번부터 세요).
잠깐 확인 — dataset[3]을 쓰면 내부에서 어떤 메서드가 호출될까요?
__getitem__(3)이에요. 3번 인덱스(네 번째) sample의 (입력, 정답) 쌍이 나와요.
자료: 7주차 · Week05_Dataset_DataLoader_Train_Validation(part1) · 7주차 녹취(빅데이터07)