PyTorch - DataLoader, Transform

나라마야·2023년 7월 18일

PyTorch

목록 보기
2/5

공식 파이토치 사이트 (한국 사용자)

DataLoader로 학습용 데이터 준비

데이터셋의 특징을 가져오고, 하나의 샘플에 정답을 지정하는 일을 한 번에 처리합니다. 또 가져온 샘플들을 미니배치 로 전달하고, 에폭마다 데이터를 다시 섞어 과적합을 막습니다.

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)

이전에 포스트한 Dataset과 연관지어 본다면,

...

dataset = Dataset(img_path, file, transform, target_transform)
dataloader = DataLoader(dataset, batch_size, shuffle)

Transform

변형을 통해 데이터를 조작하고 학습에 적합하게 만듭니다.

import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

...

ds = datasets.FashionMNIST(
    transform=ToTensor(),
    target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)

transform=ToTensor() 과 target_transform=Lambda() 를 확인합니다.

ToTensor()

ToTensor 는 PIL Image나 NumPy ndarray 를 FloatTensor 로 변환하고, 이미지의 픽셀의 크기(intensity) 값을 [0., 1.] 범위로 비례하여 조정(scale)합니다.

Lambda 변형

Lambda 변형은 사용자 정의 람다(lambda) 함수를 적용합니다.

여기에서는 정수를 원-핫으로 부호화된 텐서로 바꾸는 함수를 정의합니다. 이 함수는 먼저 (데이터셋 정답의 개수인) 크기 10짜리 영 텐서(zero tensor)를 만들고, scatter_ 를 호출하여 주어진 정답 y 에 해당하는 인덱스에 value=1 을 할당합니다.

albumentations를 사용한 transform

공식사이트

코드로 우선 보여드리겠습니다.

import albumentations as A

...

transform = A.Compose(
    [
        A.SmallestMaxSize(max_size=160),
        A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=15, p=0.5),
        A.RandomCrop(height=128, width=128),
        A.RGBShift(r_shift_limit=15, g_shift_limit=15, b_shift_limit=15, p=0.5),
        A.RandomBrightnessContrast(p=0.5),
        A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
        ToTensorV2(),
    ]
)

dataset = Dataset(csv_file, transform=transform)

A.Compose() 로 변경할 사항을 정의할 수 있습니다.

profile
언제나 나 자신에게 되물어 보기. So What?

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

아주 유용한 정보네요!

답글 달기
comment-user-thumbnail
2023년 7월 18일

글이 잘 정리되어 있네요. 감사합니다.

답글 달기