시험공부빅데이터분석
← 보드Dataset과 DataLoader · 2/8

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): def __init__(self, x, y): super().__init__() if len(x) != len(y): raise ValueError("입력과 정답의 sample 수가 달라요.") self.x = x self.y = y def __len__(self): return len(self.x) def __getitem__(self, index): return self.x[index], self.y[index] toy_x = torch.arange(10, dtype=torch.float32).reshape(-1, 1) toy_y = 2 * toy_x + 1 custom_dataset = MyDataset(toy_x, toy_y) print("sample 수:", len(custom_dataset)) x0, y0 = custom_dataset[0] print("첫 sample:", x0, y0) print("sample shape:", x0.shape, y0.shape)
sample 수: 10 첫 sample: tensor([0.]) tensor([1.]) sample shape: torch.Size([1]) torch.Size([1])
코드 줄무슨 뜻
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의 (입력, 정답) 쌍이 나와요.

다음 카드 → TensorDataset — 이미 만들어진 Dataset ★★★

자료: 7주차 · Week05_Dataset_DataLoader_Train_Validation(part1) · 7주차 녹취(빅데이터07)