Dataset과 DataLoader

안소희·2024년 7월 8일

PyTorch

목록 보기
3/8

Dataset과 DataLoader

지저분한 데이터셋 코드를 더 나은 가독성과 모듈성을 위해 모델 학습 코드로부터 분리하는것이 이상적이다. PyTorch는 torch.utils.data.DataLoadertorch.utils.data.Dataset의 두 가지 데이터 기본 요소를 제공하여 미리 준비해둔 pre-loaded 데이터셋 뿐만 아니라 가지고 있는 데이터를 사용할 수 있도록 한다.

  • Dataset : 샘플과 정답을 저장
  • DataLoader: 샘플에 쉽게 접근할 수 있도록 순회 간으한 객체로 감싼다

데이터셋 불러오기

TorchVision에서 Fahsion-MNIST 데이터셋을 불러와보자. 이미지 데이터셋으로 60,000개의 학습 예제와 10,000개의 테스트 예제로 이루어져 있다. 28x28 이미지와 10개의 분류 중 하나의 정답으로 구성

-root : 학습/테스트 데이터가 저장되는 경로
-train : 학습용 또는 테스트용 데이터셋 여부 지정
-download=True: root에 데이터가 없는 경우 인터넷에서 다운로드
-transformtarget_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 파일에 별도로 저장된다

  • init :
    - Dataset 객체가 생성될때 한 번만 실행된다. 여기서는 이미지와 주석파일이 포함된 디렉토리와 두가지 변형을 초기화 한다
  • len :
    - 데이터셋의 샘플 개수를 반환한다
  • getitem :
    - 주어진 인덱스 idx에 해당하는 샘플을 데이터셋에서 불러오고 반환한다.
    위치 식별 -> 이미지를 텐서로 변환 -> csv 데이터로부터 해당하는 정답 가져오기 -> 변형 함수들을 호출 -> 텐서 이미지와 라벨을 dict형으로 반환

DataLoader로 학습용 데이터 준비하기

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를 통해 순회하기

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}")

profile
인공지능.관심 있습니다.

0개의 댓글