Pytorch

DataLoader

술임 2025. 4. 11. 19:20

data

좋은 데이터 

- 양 : 크기가 크다

- 완결성 : 비어있는 값이 없다

- 신뢰도 : 현실을 잘 계측함

- 시기적절함 : 필요할 때 수집하고 사용

 

데이터 기술 시 사용하는 단어

특성 : 정형/비정형

크기 : 행 수, 차원 수 , 크기

타입 : 범주형 변수와 연송형 변수

용도 : 학습, 검증(모델 튜닝), 평가 데이터 (7:2:1)

-> 더 좋은 모델일수록 검증 데이터에서 잘 나오면 평가 데이터에서도 잘 나옴

 

정형데이터

행, 열(; 차원 dimension), 크기

 

비정형데이터

구조가 없는 이미지, 자연어 등

 

데이터 확보 전략

수집 목적과 데이터 종류에 대해 구체적인 계획 세우는 것이 좋음.

 

데이터 행의 개수 - 최대한 많을 수록 좋음

테이블 데이터 - 특성의 개수가 너무 많을 경우 문제가 됨

-> overfitting의 위험성

-> 모델이 복잡해짐  (ML)

-> 중요한 특성만 남김 : 특징 추출 feature selection (ML)

-> 특성을 합쳐 수를 줄임 : 차원 축소 dimensionality reduction  (ML)

 

 

Encoding

인코딩 후 입력 데이터는 정해진 개수의 차원으로 이루어진 벡터로 변환됨

실제로는 각 유형의 데이터를 인코딩하고 전처리할 때 다양한 기법 적용

어떤 입력 데이터든 결국 수치로 변환되어 딥러닝 모델에 입력됨

 

table data encoding

min-max normalization

평균과 표준편차 활용

 

image data encoding

벡터 표현 후 텐서 표현

 

음성데이터

주파수 분석 후 이미지 표현이나 실수화 가능함.

 

비디오데이터

프레임수

텐서의 크기는 정의대로 늘어날 수 있음. 

데이터를 고정 크기의 텐서로 만듦

 

Dataset

loading dataset

더 나은 가독성과 모듈성을 위해 데이터 처리 코드가 별도로 존재해야함

torch.utils.data.DataLoader # 샘플에 쉽게 접근할 수 있도록 데이터셋에 패키징. 데이터셋을 받아서 데이터를 뿌려주는 역할. 셔플을 할 수 있다던지

torch.utils.data.Dataset # 샘플과 해당 라벨을 저장. 데이터 불러오거나

 

이미지 간의 다양한 특징을 학습시키기 위해서는 배치 사이즈를 올려야함

데이터를 다운받거나, 조작하거나, 배치 만드는 등 데이터 조작에 있어서 다양한 기능이 필요함

import torch
from torch.utils.data import Dataset # 인터페이스
from torchvision import datasets # 이미 있는 데이터셋들
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt

training_data = datasets.FashionMNIST(
root= "data", # train/test 데이터의 저장 장소
train=True, # train과 test 여부
download=True, # root 디렉토리에 데이터가 없을 때, 인터넷으로부터 다운로드
transform=ToTensor() # specify the feature and label transofrmation
)

 

Creating a Custom Dataset for your files

import os
import pandas as pd
from torchvision.io import read_image

class CustomImageDataset(Dataset):
  def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
  # 데이터를 파일의 경로에서 받아와서 메모리에 올리는 것
  # 사용할 데이터를 세팅함
  # 파일에서 불러올 수도 있고, 인터넷 네트워크에서 가져올 수도 있음. url 정보만 세팅을 해서 실제 데이터를 불러오는
  
    self.img_labels=pd.read_csv(annotations_file) 	# 데이터의 라벨 파일을 불러온다
    self.img_dir=img_dir 							# directory에서 이미지 가져온다
    self.transform=transform 						# image에 대해서 transform을 적용한다
    self.target_transform=target_transform 			# label에 대해서 데이터를 조작함
  
  def __len__(self):
    return len(self.img_labels)

  def __getitem__(self,idx): # 이미지 path에서 이미지 가져옴 idx는 데이터로더에서 알아서 설정해주는 것
    img_path=os.path.join(self.img_dir, self.img_labels.iloc[idx,0])	
    image=read_image(img_path)				# 데이터 path에서 이미지를 가져옴
    label=self.img_labels.iloc[idx,1]		# 라벨에서 인덱스를 가져옴. 인덱스만큼만 가져올것
    if self.transform: # optional
      image = self.transform(image)
    if self.target_transform:
      label = self.target_transform(label)	# 라벨에서 transform이 있으면 조절해주는 것

    return image, label 					# idx를 잘 활용해서 라벨, 이미지를 잘 가져오면 됨

 

__init__

데이터셋 객체를 인스턴스화 할 때 한 번 실행, 호출할 때 한 번 실행됨

이미지, 주석 파일 및 두 변환이 포함된 디렉토리를 초기화

 

__len__

데이터셋의 샘플 수를 반환

 

__getitem__

주어진 인덱스 idx의 데이터셋에서 샘플을 로드하고 반환 

-> dataloader에서 인덱스 idx를 리스트 형태로 반환함

e.g. [0 1 2 4 99 76]

전체 데이터셋에서 딱딱 가져옴

 

1) 인덱스를 기반으로 디스크에서 이미지의 위치를 식별

2) read_image를 사용해서 텐서로 변환

3) self.img_labels의 csv 데이터에서 해당 라벨을 검색

4) 변환 함수 호출

5) 튜플에서 텐서 이미지와 해당 라벨을 반환

Data Loader

데이터셋을 모델에 넣기 위해 필수 Shuffle, Batch

데이터셋은 한 번에 하나의 샘플feature and label을 반환

모델 훈련시킬 때 일반적으로 미니배치 단위로 모델에 샘플을 전달

모델 과적합을 줄이기 위해 매 에포크마다 데이터를 reshuffle

파이썬의 멀티프로세싱을 사용해서 데이터 검색 속도 향상 GPU 사용하면 제약사항이 많을 수 있음

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)
# DataLoader에 인자로는 Dataset이 들어가야만 함

 

한번 input으로 사용된 데이터는 같은 epoch에서 또 사용되지 않게 관리해줌

 

iterate through the dataloader

데이터셋(파이토치에서 클래스를 상속받아서 구현이 된 Dataset)을 dataloader에 로드한 후 필요에 따라 데이터셋을 반복 호출 가능

각 반복은 train_features와 train_labels의 배치를 반환(각각 batch_size=64뭉치와 라벨 포함)

shuffle=True를 지정했기 때문에 모든 배치를 반복한 후 데이터를 셔플링

 

# display image and label
train_features, train_labels= next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img=train_features[0].squeeze()
label= train_labels[0]
plt.imgshow(img, cmap="gray")
plt.show()
print(f"Label: {label}"

 

 

 

 

 

 

 

 

 

 

 

 

'Pytorch' 카테고리의 다른 글

Model  (0) 2025.04.14
Transform  (0) 2025.04.14
Tensors Operation  (0) 2025.04.09
Tensor  (0) 2025.04.08
딥러닝 파이프라인  (0) 2025.04.07