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}"