DataBlock와 DataLoader 비교

2023. 9. 17. 14:32딥러닝 모델: 파이토치

♣ DataBlock

 

데이터 블록은 데이터 조립을 위한 파이프라인일 뿐입니다. 데이터 블록을 처음 생성할 때 데이터를 명시할 필요는 없습니다. 그러나 데이터가 흐를 때 어떻게 처리할지에 대한 규칙을 명시해야 합니다. 데이터가 어떻게 수집, 분류 및 분할되어야 하는지에 대해 관심이 있으며, 데이터가 무엇으로 사용될지는 상관하지 않습니다.

데이터 블록을 생성하려면 다음을 명시해야 합니다.

  1. 입력(즉, 특성)과 목표 변수(즉, 레이블)에 대한 예상 데이터 유형
  2. 데이터를 가져오는 방법
  3. 목표 변수로부터 특성을 구분하는 방법
  4. 훈련을 위해 데이터를 분할하는 방법(훈련 및 검증 세트)

어떻게 하는지 살펴보겠습니다. 아래는 고양이의 다른 종(즉, 분류 모델)을 인식하기 위해 합성곱 신경망(CNN)을 생성하려면 만들어볼 수 있는 예제 데이터 블록입니다.

 

DataBlock 예시

위 코드에서 언급한 네 가지 주요 단계는 DataBlock의 처음 네 가지(필수) 인수와 정확히 일치합니다:

  1. blocks: 여기에서 모델이 작동할 데이터 유형을 정의합니다. 일반적으로 최소 두 개의 블록을 지정합니다. 하나는 독립(입력) 변수를 나타내고, 다른 하나는 종속(목표) 변수를 나타냅니다. 여러 입력/출력 변수를 지정할 수도 있습니다.
  2. get_items: 필요할 때 실제로 데이터를 가져올 함수입니다.
  3. splitter: 데이터를 훈련 및 검증 세트로 나누는 방법입니다. seed(씨앗)는 선택 사항이며 재현성을 위해 추가됩니다.
  4. get_y: 데이터에서 목표(종속) 변수를 추출하는 방법입니다. 우리 고양이 분류기의 경우, 이는 상위 폴더를 보고 판별하게 됩니다. 또한 fast.ai에서 parent_label이라는 내장 함수를 제공합니다.

item_tfms는 데이터를 흐를 때 수행해야 하는 추가 처리를 지정하기 위해 포함할 수 있는 선택적 인수입니다. 이 경우 이미지를 모두 128x128로 크기 조정할 것입니다. 다른 변환을 지정할 수도 있습니다. 예를 들어 item_tfms=Resize(128, ResizeMethod.Squish)는 이미지를 크기 조정하고 눌러 맞출 것이며, item_tfms=Resize(128, ResizeMethod.Pad, pad_mode='zeros')는 남은 공간을 검은 색으로 채우면서 크기를 조정합니다. 이 방법은 데이터 증강도 지원하므로 매우 강력합니다. 이 블로그 포스트의 범위를 벗어나지만 item_tfms를 사용하면 데이터가 모델에 전달되기 전에 데이터를 사전 처리할 수 있음을 알아두세요.

 

 

♣ DataLoader

데이터 블록을 정의했으며 데이터가 어떻게 구조화, 분류되고 처리되어야 하는지 정확히 지정했습니다. 이제 실제로 모델 훈련에 사용할 데이터를 제공할 수 있습니다. 이 데이터 DataLoader를 사용하여 로드합니다. 여기에서 DataLoaders가 등장합니다. DataLoaders는 DataBlock이 지정한 규칙에 따라 데이터를 특정 배치 크기로 로드하기 위해 호출하는 반복자 클래스입니다.

fast.ai에서의 DataLoader는 PyTorch DataLoader의 슈퍼셋으로, 더 많은 유용한 콜백과 유연성을 제공합니다. 데이터 블록은 데이터를 어떻게 구조화할지 알고 있지만, 로더는 기계 학습 모델을 훈련하는 맥락에서 데이터 작업 방법을 알고 있습니다. 즉, 한 번에 모델에 얼마나 많은 데이터를 공급할지(배치 크기), 데이터를 로드하기 위해 몇 개의 프로세스를 생성할지, 얼마나 많은 메모리를 할당할지 등을 알고 있습니다.

DataLoaders(복수형)는 DataBlock에서 지정한 규칙에 따라 여러 DataLoader(단수형) 객체를 자동으로 생성하는 가볍게 감싸진 클래스입니다.

 

 

DataBlock을 만든 뒤 dls에 적용하는 예시

 

 

♣ 정리

  1. DataBlock (데이터 블록): 데이터 파이프라인입니다. 데이터가 없지만 데이터 처리 방법에 대한 모든 정보를 가지고 있는 템플릿입니다. 예를 들어 데이터를 어떻게 분할할지, 특성과 목표/레이블의 데이터 유형, 기본 데이터에서 레이블을 추출하는 방법(예: 폴더 이름) 등이 포함됩니다.
  2. DataLoader (데이터 로더): 데이터 준비에 대해 신경 쓰지 않으며 데이터가 준비되었다고 가정하며 데이터를 로드하는 방법(병렬로 처리할지 단일 프로세스로 처리할지) 및 모델에 데이터를 일괄(batch)로 공급하는 방법(즉, 배치 크기)에만 관심이 있습니다.
  3. DataLoaders (데이터 로더들): 하나 이상의 DataLoader를 더 간단하게 다루기 위한 래퍼입니다. DataBlock에서 지정한 규칙에 따라 여러 개의 DataLoader를 자동으로 생성하고 관리합니다.

요약하면, DataBlock은 데이터를 어떻게 처리해야 하는지에 대한 설정 및 템플릿을 제공하고, DataLoader는 실제 데이터를 로드하고 모델에 공급하는 역할을 합니다. DataLoaders는 이러한 DataLoader들을 한 곳에서 관리하고 조정하여 작업을 단순화합니다.

 

DataBlock과 DataLoader를 이용하여 DataLoader를 만드는 두 가지 방법 비교

https://jy-deeplearning.tistory.com/14

 

DataLoader 만들기 비교

A B 둘 다 DataLoader 객체를 생성하고 있음. A보다 B가 좀 더 파라미터를 많이 사용하여 customize하고 있는 것. A에서 batchsize를 주고 싶으면 dls = mnist.dataloaders(path, bs=64) 이런 식으로 줄 수 있음.

jy-deeplearning.tistory.com

 

♣ 참고

https://muttoni.github.io/blog/machine-learning/fastai/2020/12/26/datablocks-vs-dataloaders.html