지저분한 데이터셋 코드를 더 나은 가독성과 모듈성을 위해 모델 학습 코드로부터 분리하는것이 이상적이다. PyTorch는 torch.utils.data.DataLoader와 torch.utils.data.Dataset의 두 가지 데이터 기본 요소를 제공하여 미리 준비해둔 pre-loaded 데이터셋 뿐만 아니라 가지고 있는 데이터를 사용할 수 있도록 한다.
TorchVision에서 Fahsion-MNIST 데이터셋을 불러와보자. 이미지 데이터셋으로 60,000개의 학습 예제와 10,000개의 테스트 예제로 이루어져 있다. 28x28 이미지와 10개의 분류 중 하나의 정답으로 구성
-root : 학습/테스트 데이터가 저장되는 경로
-train : 학습용 또는 테스트용 데이터셋 여부 지정
-download=True: root에 데이터가 없는 경우 인터넷에서 다운로드
-transform 과 target_transform : 특징과 정답변형을 지정
Dataset에 리스트처럼 직접 접근할 수 있는데 matplotlib을 사용하여 학습 데이터의 일부를 시각화해보자
labels_map = {
0: "T-Shirt",
1: "Trouser",
2: "Pullover",
3: "Dress",
4: "Coat",
5: "Sandal",
6: "Shirt",
7: "Sneaker",
8: "Bag",
9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
sample_idx = torch.randint(len(training_data), size=(1,)).item()
img, label = training_data[sample_idx]
figure.add_subplot(rows, cols, i)
plt.title(labels_map[label])
plt.axis("off")
plt.imshow(img.squeeze(), cmap="gray")
plt.show()

사용자 정의 Dataset 클래스는 반드시 3개 함수를 구현해야 한다. FashionMNIST 이미지들은 img_dir 디렉토리에 저장되고, 정답은 annotations_file csv 파일에 별도로 저장된다
Dataset은 데이터셋의 특징을 가져오고 하나의 샘플에 정답을 지정하는 일을 한번에 한다. 모델을 학습할때, 일반적으로 샘플들을 미니배치로 전달하고, 매 에폭마다 데이터를 다시 섞어서 과적합을 막고, python의 멀티프로세싱을 사용해서 검색 속도를 높인다
DataLoader 는 간단한 API로 복잡한 과정들을 추상화하는 순회 가능한 객체이다
from torch.utils.data import DataLoader
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)
DataLoader 에 데이터셋을 불러온 뒤에는 필요에 따라 데이터셋을 순회(iterate)할 수 있다. 아래의 각 순회(iteration)는 (각각 batch_size=64 의 특징(feature)과 정답(label)을 포함하는) train_features 와 train_labels 의 묶음(batch)을 반환한다. shuffle=True 로 지정했으므로, 모든 배치를 순회한 뒤 데이터가 섞인다
# 이미지와 정답(label)을 표시합니다.
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")

