본문 바로가기
TIL/Boostcamp AI tech

[Boostcamp]Week4-Day16. Dataset & Dataloader :: seofware

by seowit 2021. 8. 24.
목차
1. 강의정리
    1-1. [P]이미지 분류 - chap3. Dataset
    1-2. [P]이미지 분류 - chap4. Data Generation
2. 피어세션 정리
3. 데일리 회고 

* P stage 는 3주간 배운 이론을 실제로 사용해보는 시간입니다.


📜 강의 정리 


[P stage] Chapter3. Dataset

 

🌈데이터전처리 방법과 일반화에 대해 알아보자

컴피티션이 데이터셋은 정제된 데이터를 담고 있지만, 실제 데이터의 품질은 보장하기 힘들다.

1. 데이터전처리

  • 1. Bounding box
    • 이미지 데이터에는 우리가 필요로 하는 데이터 외에 불필요한 정보까지 담고 있다.
  • 2. Resize
    • 화소가 너무 많으면 학습시킬 파라미터가 너무 많아서 학습시간이 오래걸린다. 따라서 계산의 효율을 위해 적당한 크기로 사이즈를 변경해야 한다.

2. Generalization(일반화)

  • 1. Bias & Vairance : 학습이 너무 안 됐거나, 학습이 너무 됐거나 
    •  
  • 2. Train/Validation
    • 훈련 셋 중 일부를 떼어서 검증(validation)셋으로 사용
    • ** Test Set은 절대 건들면 안된다.
  • 3. Data Augmentation
    • 주어진 데이터가 가질 수 있는 case, state의 다양상
    • Albumentation library : 다양하고 빠름

[P stage] Chapter4. Data Generation

 

🌈 Dataset을 구성한 다음 모델에 빠르고, 효율적으로 Feeding 하기 위해 알아야 할 것들에 대해서 알아보자

Dataset을 잘 구성하는 것도 중요하지만, 모델이 잘 학습할 수 있도록 데이터를 잘 뽑아내는 방법도 중요하다.

데이터를 잘 뽑아낸다는 의미가 무엇일까?

1. Data Feeding

  • 예를 들어, resize 순서에 따라서 진행 속도가 다르다

2. torch.utils.data

  • Dataset
    • 바닐라 데이터를 우리가 원하는 인풋 데이터 형태로 변환하는 과정
    • from torch.utils.data import Dataset
      
      class MyDataset(Dataset):
        # MyDataset 클래스가 처음 선언 되었을 때 호출
        def __init__(self):
        	pass
        # MyDataset의 데이터 중 index 위치의 아이템을 리턴
        def __getItem__(self, index):
        	return None
        # MyDataset 아이템의 전체 길이
        def __len__(self):
        	return None
  • Dataloader
    • 내가 만든 Dataset을 효율적으로 사용할 수 있도록 기능 추가한 것
    • batch_size, num_workers, drop_last 등
    • DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
                 batch_sampler=None, num_workers=0, collate_fn=None,
                 pin_memory=False, drop_last=False, timeout=0,
                 worker_init_fn=None, *, prefetch_factor=2,
                 persistent_workers=False)

 

Dataset과 Dataloader는 다른 기능을 수행하므로, 재활용성을 생각해서 분리하는 것이 좋습니다. 

Dataset은 Data마다 다르지만 Dataloader는 바꿀 일이 거의 없다.


🙋‍♀️피어세션

 

데이터셋의 구조에 대해 살펴보고, data augmentation 과정에서 어떤 transform을 적용할지에 대해 대화했다. 

https://luck-tuberose-cf9.notion.site/2021-08-24-4c1d57efb60a4e4a920b7f345ffd9704

 

피어세션(2021/08/24)

TMI

luck-tuberose-cf9.notion.site


💌 데일리 회고

실습 시작해서 재밌다.

다른 사람들이 공유하는 코드도 보니까 이론에서 배운거 적용도 되고, 다양한 방법에 대해서 알게 되는 것 같다.

빨리 baseline 코드 완성해서 정확도 높이는데 열중하고 싶다!


❓ Data augmentation 과정에서 transform에 대한 이해가 잘 안됐었는데 강의질문 답변을 통해 해결했다. 

질문:
안녕하세요 강의 중 궁금한 점이 생겨서 질문 남기게 되었습니다.
transforms가 모든 이미지에 적용이 되는 것인지 랜덤하게 적용되는 건지 궁금합니다!

예를 들어, dataset에 이미지가 100개 있다고 하면, transforms를 하게 되면 100개의 이미지에 대해 모두 적용이 되서 200개의 이미지가 되는 건가요? 

그게 아니라 랜덤하게 적용 된다면, 변환되는 이미지의 원본은 변환된 이미지로 대체되는 건지(데이터셋 100개 유지) 기존 데이터셋에 변환된 데이터가 추가되는건지 궁금합니다. 

강의 잘들었습니다. 감사합니다 :)

🦆멘토님🦆 답변:
안녕하세요 김서원님!

원본 이미지가 100개 존재하고 거기에 transform을 적용하면 변환된 이미지 100개가 나오게 됩니다.transform으로 변형된 이미지는 휘발되며 남아있지 않습니다. 오직 원본 이미지만 남게 됩니다.

원본 이미지 100개는 변하면 안됩니다. 이 이미지들은 계속 그대로 유지되며 새로운 추가적인 이미지를 훈련에 활용하고 싶은데 새롭게 추가할 이미지가 없을 경우, 원본 이미지에 transform을 적용하여 변환된 이미지를 새로운 추가적인 이미지처럼 활용하게 됩니다. 이때 매 순간 순간 transform을 적용해서 변환된 이미지는 보존되지 않습니다. 그 순간의 훈련에만 사용되고 사라집니다.

원본 + 원본을 transform을 이용해 변환한 이미지 이 2가지를 훈련에 사용하게 됩니다. 그래서 transform을 보시면 항상 적용되게 되어있지 않고 p=0.5와 같은 probability 인자를 통해서 확률적으로 적용되게 합니다. 같은 이미지더라도 어떨때는 원본 그대로 어떨때는 변형시켜서 내보내게 되는 것이죠. 이 방식으로 data augmentation의 효과를 가져오게 됩니다.

댓글