PyTorch 시작하기 - dataset

김상윤·2022년 5월 2일
0

AI이모저모

목록 보기
4/13

dataset

  • PyTorch에서 torch.utils.data.Dataset의 하위 클래스로 preloaded dataset을 제공
import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor

training_data = datasets.FashionMNIST(
    root="./data", 	#데이터 저장 경로
    train=True, 	#True=train set, False=test set
    download=True,	#경로에 데이터가 없는 경우 인터넷에서 다운로드
    transform=ToTensor()	#data에 지정한 transform 수행
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)
  • TensorDataset()함수를 이용해 dataset 생성
from torch.utils.data import TensorDataset # 텐서데이터셋
x_train  =  torch.FloatTensor([[73,  80,  75], 
                               [93,  88,  93], 
                               [89,  91,  90], 
                               [96,  98,  100],   
                               [73,  66,  70]])  
y_train  =  torch.FloatTensor([[152],  [185],  [180],  [196],  [142]])
dataset = TensorDataset(x_train, y_train)

dataset 정의하기

  • 파일의 data를 통해 dataset 클래스를 만드는 과정.
    : 추상클래스 torch.utils.data.Dataset를 Dataset에 상속받아서 함수들을 override한다.
class FaceLandmarksDataset(Dataset):
    """Face Landmarks dataset."""

    def __init__(self, csv_file, root_dir, transform=None):
        """
        Args:
            csv_file (string): csv 파일의 경로
            root_dir (string): 모든 이미지가 존재하는 디렉토리 경로
            transform (callable, optional): 샘플에 적용될 Optional transform
        """
        self.landmarks_frame = pd.read_csv(csv_file)
        self.root_dir = root_dir
        self.transform = transform

    def __len__(self):
        return len(self.landmarks_frame)

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        img_name = os.path.join(self.root_dir,
                                self.landmarks_frame.iloc[idx, 0])
        image = io.imread(img_name)
        landmarks = self.landmarks_frame.iloc[idx, 1:]
        landmarks = np.array([landmarks])
        landmarks = landmarks.astype('float').reshape(-1, 2)
        sample = {'image': image, 'landmarks': landmarks}

        if self.transform:
            sample = self.transform(sample)

        return sample
  • init() : 파일 안의 data를 읽어 옴 _ 파일 경로와, 적용할 transform을 통해
  • len() : 데이터셋의 크기 리턴 _ len(dataset) 때 호출
  • getitem() : i번째 샘플을 찾는데 사용 _ dataset[i] 때 호출

transform

  • 학습에 적합한 형태로 data를 변형하여 모델에 넘기기 위한 과정
  • ToTensor()
    : ndarray를 FloatTensor로 변환, scaling
transform=ToTensor()
  • 람다 transform
    : 사용자 정의 람다함수 적용
target_transform = Lambda(lambda y: torch.zeros(
    10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))

DataLoader

  • 모델을 학습을 위해 전달 할 data sample의 minibatch의 batch_size를 설정하고, 매 epoch 마다 데이터를 섞어 overfitting을 방지하고, multiprocessing을 통해 데이터 검색 속도를 높이는 과정들을 추상화하여 제공하는 객체
  • 생성한 dataset을 설정한 옵션에 맞게 batchsize로 슬라이싱하여 mini-batchs로 만들어준다.
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)

0개의 댓글