1. Dataset와 DataLoader
1.1. Dataset
torch.utils.data.Dataset은 데이터셋을 정의하는 기본 클래스입니다. 데이터를 메모리에서 가져오는 방법을 정의하며, 개발자가 자체적으로 데이터셋을 만드는데 사용됩니다. Dataset의 중요한 메서드는 __len__, __getitem__ 입니다. __len__은 데이터셋의 크기를 반환하고, __getitem__ 주어진 인덱스에 해당하는 데이터를 학습에 적합한 형태로 변환할 수 있습니다.
from torch.utils.data import Dataset
class MyDataset(Dataset):
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx]
1.2. DataLoader
Pytorch로 딥러닝 학습을 진행하면, torch.utils.data.DataLoader라는 것을 많이 사용하게 됩니다. DataLoader는 데이터셋에서 데이터를 배치 단위로 로드하는 역할을 수행합니다. 이를 통해 모델이 배치 단위로 학습을 진행하고, 별도로 구현된 코드를 통해 메모리 사용을 최적화하고 학습 속도를 높여줄 수 있습니다.
DataLoader에는 다음과 같은 주요 세팅 값을 지정해서 사용할 수 있습니다.
- batch_size : 배치당 얼마나 많은 데이터 샘플을 가져갈지 결정
- shuffle : 데이터를 로드할 때마다 순서를 무작위로 섞을지를 결정
- num_workers : 데이터 로드를 위해 얼마나 많은 병렬처리를 위한 서브프로세서를 사용할지 결정
- drop_last : 마지막 배치 크기 사이즈가 지정한 숫자보다 작을 경우 버릴지 결정
- 추가 설명 : https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader
torch.utils.data — PyTorch 2.4 documentation
torch.utils.data At the heart of PyTorch data loading utility is the torch.utils.data.DataLoader class. It represents a Python iterable over a dataset, with support for These options are configured by the constructor arguments of a DataLoader, which has si
pytorch.org
이렇듯 원래라면 한줄씩 코드를 구현하는 노력이 필요하겠지만, 학습 코드에서 제외하고 별도의 Class를 통해 가독성을 높일 수 있기 때문에 (심지어 직접 구현한 것보다 더 효율적일 수 있기 때문에) 자주 활용됩니다.
2. DataLoader 오류
2.1. DataLoader 작동
Dataset 자체는 이터레이터가 아니므로, next()를 사용할 수 없습니다. 하지만 __getitem__을 통해 인덱스를 통해 데이터를 반환하는 방식이 동작할 수 있습니다. DataLoader는 __iter__와 __next__ 메서드를 구현해 이터레이터로 동작합니다. DataLoader는 인덱스 - 이미지(데이터)로 반환하고 있는 Dataset을 받아서 사용하고 있습니다. 그렇기 때문에 아래와 같은 코드가 가능합니다.
for images in tqdm(data_loader):
# 정상적인 이미지 처리
images = images.to(device)
predictions = model(images)
하지만, 이터레이터 특성상 중간에 데이터가 빌 경우 문제가 발생할 수 있습니다.
2.2. DataLoader 오류 해결
DataLoader를 잘 사용하던 중 아래와 같은 오류가 나왔습니다.
error: OpenCV(4.9.0) /io/opencv/modules/imgproc/src/color.cpp:196: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
위 오류의 설명은 OpenCV의 cvtColor() 함수가 비어 있는 이미지를 처리하려고 할 때 발생한 문제입니다. 즉, 이미지가 None인 상태에서 cvtColor()를 호출하려고 해서 실패하고 있는 것입니다.
위(2.1)에서 언급하고 있는 DataLoader 작동을 생각해봤을 때 이미지가 없다는 것은 iterable 객체에 중간에 데이터가 비어 있을 것이라 추론할 수 있습니다. 살펴보니 데이터셋으로 가져오고 있는 데이터가 비어있는 것을 발견해 데이터를 추가해서 오류를 해결했습니다.
'Python > Data Prep' 카테고리의 다른 글
DeepL을 활용해서 외국어 OCR 영수증 데이터셋 합성하기 (2) | 2024.11.09 |
---|---|
[OD] 객체 탐지(Object Detection) 대표 데이터 포맷 공부 | COCO, Pascal VOC, YOLO (0) | 2024.10.04 |
PyTorch에서 Dataset과 DataLoader 클래스를 활용해 데이터 파이프라인 구축하기 (1) | 2024.09.09 |
Colab에서 Kaggle 데이터셋 가져오기 | Kaggle, API, Colab (0) | 2024.08.10 |
Selenium 을 활용한 Element 찾기 (find_element, By) | Python, Web Scraping, Web Crawling, 자동화 (0) | 2022.08.09 |