Dataset, Dataloader 개념

예갈조·2024년 12월 18일

Tumor Track Project

목록 보기
20/25

Dataset

데이터셋 클래스 정의의 목적


  • 효율적이고 유연한 데이터 관리를 위해서
  1. 데이터와 모델 간 인터페이스 제공
    1. 딥러닝 모델은 배치 단위로 데이터를 받아야 함
    2. 데이터셋 클래스는 데이터를 효율적으로 전처리하고 모델이 학습할 수 있도록 배치 단위로 데이터를 반환해줌
    3. Pytorch의 DataLoader와 통합하여 학습 단계에서 데이터를 자동으로 공급할 수 있음
  2. 데이터 전처리를 자동으로 적용할 수 있음



클래스 구조


  1. __init__(self): 생성자
def __init__(self, data_dir, transform=None):
    self.data_dir = data_dir
    self.transform = transform # 데이터셋에 적용할 전처리 파이프라인

    # 'no'와 'yes' 디렉터리의 모든 파일 경로를 리스트로 저장
    self.image_paths = []
    self.labels = []

    for label, sub_dir in enumerate(["no", "yes"]):  # 'yes'는 1, 'no'는 0으로 라벨링
        sub_dir_path = os.path.join(data_dir, sub_dir)
        
        # os.listdir: 하위 디렉토리의 모든 파일 이름 얻기
        for file_name in os.listdir(sub_dir_path):
            file_path = os.path.join(sub_dir_path, file_name)
            
            # os.path.isfile: 각 파일 존재 여부 확인
            if os.path.isfile(file_path):
                self.image_paths.append(file_path) # 이미지 파일 경로 저장
                self.labels.append(label) # 이미지 라벨 저장

  1. __len__(): 데이터셋 크기 반환
def __len__(self):
    return len(self.image_paths)
  • 데이터셋 전체 크기 반환
  • 데이터셋의 크기를 알아야 DataLoader에서 배치를 생성하거나 에포크를 정의할 수 있음

  1. __getitem__(index): 샘플 가져오기
def __getitem__(self, index):
    img_path = self.image_paths[index] # index에 해당하는 이미지 파일 경로 가져오기
    label = self.labels[index] # index에 해당하는 이미지 라벨 가져오기

    # 이미지 로드
    image = Image.open(img_path).convert("RGB")

    # 데이터 변환 적용
    # transform(정규화, 텐서 변환 등을 수행) 따로 정의해주어야 함
    if self.transform:
        image = self.transform(image)

    return image, label
  • 지정된 인덱스 데이터 반환 → 데이터셋의 특정 항목을 불러올 수 있도록 구현



Dataloader

사용하는 이유


  1. 효율적인 데이터 배치 처리
    1. 모델 학습 시 데이터를 batch 단위로 로드하여 병렬 연산을 효율적으로 수행 가능
      1. batch 기반의 딥러닝 모델 학습을 위해서 mini batch를 만들어주는 역할
      2. dataloader를 통해 dataset의 전체 데이터가 batch size로 slice
    2. 매번 하나씩 데이터를 불러오는 것보다 학습 속도 빠름
  2. 메모리 관리
    1. 데이터셋 전체를 한꺼번에 메모리에 올리지 않고 필요할 때만 데이터를 불러옴
    2. 대규모 데이터셋을 사용할 때 메모리 효율성을 높임
  3. shuffling
    1. 학습 과정에서 데이터 순서를 무작위로 섞어서 과적합을 방지할 수 있음
    2. 학습할 때만 키고 아니면 꺼주어야 함
  4. 멀티스레딩
    1. 다중 스레드 사용하여 데이터를 미리 로드
  5. 자동 데이터 전처리 지원
    1. 데이터를 로드할 때 미리 정의된 전처리를 자동으로 적용



주요 parameter


import torch.utils.data

tr_dataset = BasicDataset(train_x, train_y)
train_loader = data.DataLoader(dataset=tr_dataset, batch_size=128, num_workers=8, shuffle=True)

tt_dataset = BasicDataset(test_x, test_y)
test_loader = data.DataLoader(dataset=tt_dataset, batch_size=128, num_workers=8, shuffle=False)
  • batch_size
    • 배치 당 로드할 데이터 샘플의 개수를 지정
  • shuffle
    • 에포크마다 데이터를 무작위로 섞음
      • 데이터 순서를 섞어서 모델이 데이터 순서에 의존하지 않고 일반화 능력을 키우도록 함
    • 학습 데이터에서 True로 설정, 검증/테스트 데이터에서는 False로 설정
  • num_workers
    • 데이터를 로드할 때 사용할 병렬 작업자(workers) 프로세스 수 지정
    • 병렬 처리를 통해 데이터 로딩 속도를 향상시킬 수 있음
    • 로딩 속도 최적화 해주는 파라미터들: num_workers, prefetch_factor, persistent_workers
  • drop_last
    • 마지막 배치의 데이터 수가 batch_size보다 작을 경우 이를 버릴지의 여부를 결정
    • 배치 크기가 일정해야 하는 알고리즘(배치 정규화)을 사용할 때만 True로 설정하기





참고자료

[PyTorch] Dataset과 Dataloader 설명 및 custom dataset & dataloader 만들기

0개의 댓글