dukim's blog

[WK03-Day012][21.08.18.Wed] PyTorch Datasets & DataLoader 본문

Boostcamp AI Tech 2th

[WK03-Day012][21.08.18.Wed] PyTorch Datasets & DataLoader

eliza.dukim 2021. 8. 19. 02:54

Intro

  • 과제 분량에 숨이 턱턱 막힙니다.
  • 그러나 과제 퀄리티가 너무 좋습니다. 그동안 대충 알고 넘어갔던 세밀한 부분들을 짚어주어서 도움이 되었습니다.
  • 복습 내용에 모든 걸 담지는 않았습니다. 제가 잘 몰랐던 부분에 대해 알게된 내용만 축약해 기록합니다.
  • PyTorch에서의 Datasets & DataLoader 객체에 대한 내용 + 정형 & 비정형 데이터에 대한 Datasets 생성 방법

강의 복습 내용

PyTorch Datasets & Dataloaders

DataLoader

Dataset, Sampler, Dataloader간의 관계

과제 수행 과정 / 결과물

Custom Dataset

Dataset

  • map-style dataset: 일반적인 데이터셋, index로 각 데이터에 접근 가능
  • iterable dataset: 실시간으로 생성되는 stream data 등에 적합한 데이터셋(아직은 다뤄 보지 않음)

Sampler

  • DataLoader의 index 컨트롤을 위한 객체, 설정시 shuffle=False
  • PyTorch에서 제공하는 Sampler의 종류는 많지만, 여기서 다 소개하지는 않음.
  • 사용 패턴:
    • Train, Val Split을 Sampler로만 할 때(굳이 이렇게 할 필요가 있을까 싶지만 K-fold 시 편할 것 같긴 함)
      • SubsetRandomSampler: 전체 데이터셋 중 일부를 랜덤 샘플링
          # 1. 인덱스가 담긴 리스트 생성
          dataset_size = len(my_dataset)
          dataset_idxs = list(range(dataset_size))
          # 2. 인덱스를 셔플
          np.random.shuffle(dataset_idxs)
          # 3. train-val 비율에 따라 분할
          val_split_idx = int(np.floor(0.2 * dataset_size))
          train_idx, val_idx = dataset_idxs[val_split_idx:], dataset_idxs[:val_split_idx]
          # 4. SubsetRandomSampler 인스턴스 생성
          train_sampler = SubsetRandomSampler(train_idx)
          val_sampler = SubsetRandomSampler(val_idx)
          # 5. Split별 Dataset 생성
          train_loader = DataLoader(dataset=my_dataset, shuffle=False, batch_size=2, sampler=train_sampler)
          val_loader = DataLoader(dataset=my_dataset, shuffle=False, batch_size=2, sampler=val_sampler)
    • WeightedRandomSampler: 각 '샘플'에 가중치를 부여해 샘플링함.
      • 상황 1: 불균형 데이터 처리: 각 샘플에 1/(샘플이 속한 class의 총 개수)로 가중치를 주어 사용(이 곳의 첫번째 답변 참고
      • 상황 2: 모델이 잘 맞추지 못하는 샘플에 가중치를 주어 집중적으로 학습하게 함(active learning?)
    • DistributedSampler: 분산 처리 모델의 데이터 입력(추후 알아볼 내용)
    • 참고 : PyTorch [Basics] — Sampling Samplers

num_workers

collate_fn

  • 배치단위 데이터의 변환 시에 활용
  • NLP에서는 입력 시퀀스의 길이가 가변적일 때, zero-padding 을 주기 위해서 사용됨
  • 데이터는 데이터끼리, 레이블는 레이블끼리 묶어서 출력할 때
  • ex) batch size = 3인 경우
    • 일반적인 출력: [(x1, y1),(x2, y2),(x3, y3)]
    • collate_fn을 지정하여 묶어준 출력: [(x1, x2, x3), (y1, y2, y3)]

torchvision transform

  • torchvisionPIL.Image 객체 또는 numpy.ndarray 객체로 입력 받는다.
  • 조각코드: url로부터 PIL 객체로 이미지 받기
    from PIL import Image
    im = Image.open(requests.get(url, stream=True).raw)
  • transfomrs.Compose: 여러 transforms을 한 번에 묶어 처리
  • transforms.ToTnsortransforms.Normalize의 순서: PIL Image 객체를 ToTensor로 변환하면 픽셀 값 하나의 범위가 [0, 1]로 바뀐다. 여기서 Normalize를 적용함. 순서를 반대로 할 경우 에러
  • 기타 Augmentation을 위한 라이브러리

기타 조각코드

  • [정규표현식] 두 칸 이상의 space 한 칸으로 normalize
    cleaned_text = re.sub(r'\s+', ' ', input_text)
  • 일부 문자를 제거할 때는 공백문자(space)로 치환한 다음에 공백 문자를 normalize 해주자. 그렇게 안 하면 제외한 문자 앞 뒤의 문자가 떨어져있어야하는데 붙어있는 경우가 생긴다.

피어세션

  • 모더레이터: 호영
  • 발표자: 호영, 요한
  • 회의록: 김대웅

발표

호영

  • pytorch Image classfication tutorial
  • 대회 성능 개선 방안 제안(PPT 참고)

    요한

  • CV Augmentation 기법
  • Back of Tricks for image classification with convolutional neural networks(https://arxiv.org/abs/1812.01187)
  • 모션 검출 대회 경험 공유, 실험 관리 예시 제시
    • 각각의 모델 별로, 실험 후, 성능 잘 나올 경우 더 파고 들어감
    • 다양한 augmentation 방법론 적용하면서 가능성 없는 것들을 제외함
  • 제안: 베이스 코드를 만들어 둔 다음, 각자 시도해볼 변경사항들(모델 선택, hyperparameter search)을 적용 해보고, 결과 취합해서 더 나은 방법 선택하자

학습 내용 공유

  • 한진
    • torch.gather 함수 작동 방식 설명

기타

  • 국민취업지원제도, 내일배움카드제도에 대한 공유

학습 회고

  • 과제하고 학습 정리 작성하면 하루가 훅간다.

오늘 남은 학습 내용

  • 시각화: 3-2 color. 실습, 3-3 facet 강의
  • 필수과제: gather, scatter 이해하기, Distributed Sampler에 대한 학습
  • generator vs. iterator 둘의 차이에 대한 정리
Comments