[08.24 P Stage Day2] - 💽 Dataset과 DataGeneration
DataSet
: Vanilla 한 데이터를 원하는 모델에 맞게 잘 일반화, 수정하는 작업을 통해 새 DataSet형태로 변환이 필요하다.
이미지 분류를 풀기 위해서 과정
- 이미지가 어떤 형태, 어떤 구조로 저장되어 있는지 확인
- 모델에 맞게 재구성해야 한다.
Pre-Processing
: 굉장히 중요한 작업. 생각보다 시간이 많이 차지하는 작업이다.
왜 중요한 작업일 까?
실제 데이터들을 보면 Noise도 굉장히 많고 데이터도 부족하기 때문에 이 부분에 많은 시간을 투자한다고 한다.
계산의 효율을 위해서 Resize를 시킨다.
큰 사이즈의 이미지 같은 경우들은 학습하는데 시간이 굉장히 오래 걸리기 때문에 작업의 효율을 위해서 이미지를 적절하게 줄이는 것도 중요하다.
또한, 도메인의 형식에 따라서 다양한 Case가 존재한다.
Generalization
Bias와 Variance
학습이 너무 안 됐거나(underfitting), 너무 됐거나(overfitting)
Train/Validation
Train과 Validation을 나누는 작업이 필요하다.
Train Set을 Validation으로 split하는 것은 데이터가 줄어드는 것이라 bias되는 쪽으로 될까? 싶지만
나눠야하는 궁극적인 이유는 학습한 데이터를 가지고 Test하기 전에 제대로 학습되었는지 검증할 필요가 있다.
Data Augmentation
: Data Augmentation은 데이터를 일반화하는 것이다.
→ 주어진 데이터를 다양한 경우, 형태로 바꾸면서 다양성을 부여한다. 데이터에서 일어날 수 있는 다양한 상황들, 모델의 쓰임새를 살펴보면 얻을 수 있을 것이다.
torchvision.transforms 패키지를 통해서 Augmentation 과정을 진행한다.
- 주의, 과연 사진을 찍을 때 Flip에서 180도 꺾인 경우처럼 실제 이런게 의미가 있을까? 이런 것들도 중요하다.
Albumentations 라이브러리를 통해서 더 다양한 것들을 제공받을 수 있다. transform보다 더 빠르다고한다.
해 주신 말씀!
: 항상 좋은 결과를 가져다 주지 않는다. '무조건' 이란 단어를 조심하자. 함수들이 모두 적용이 되어 성능이 높아지는 마스터 키는 아니다. 그래서 도메인에 대해서 이해를 하고 Problem Definition에 대한 깊이 있는 관찰을 통해서 실험적으로 증명해내야 한다.
DataGeneration
Data Feeding
: 데이터를 모델에 맞게 잘 만들어 준다. (정확한 의미를 정리한다.)
먹이를 준다 → 대상의 상태를 고려해서 적정한 양을 준다.
- 위의 예시에서 Model에 성능보다 Data Generator의 성능이 적다면 그만큼 효율이 낮을 것이다.
- 반대로 Data Generator의 성능이 모델이 처리할 수 있는 양보다 높으면 Model의 최대 효율을 만들 수 있다.
Pytorch Dataset을 구축해보자
- Using torch.utils.data
- Dataset
- DataLoader
- 얘네를 제공해 준다.
from torch.utils.data import Dataset
class MyDataset(Dataset):
def __init__(self): #클래스 처음 선언되면 호출
pass
def __getitem__(self, index): #index위치의 아이템을 리턴한다.
pass
def __len__(self): #아이템의 전체 길이
return None
#input -> MyDataset객체
train_loader = torch.utils.data.DataLoader(
train_set,
batch_size = batch_size, #원하는 batch_size 만큼으로 나올 것이다.
num_workers = num_workers, #thread 개수
drop_last = True,
)
#output => (Batch, Channel, Height, Width)
! 좋은 방식 → DataSet과 DataLoader는 분리하는 것이 좋다.