data augmentation & data generation 기본 개념 재활하기

1. data augmentation은 어떤 의미를 가질까

 

1-1) 목적

 

데이터를 일반화하는 과정

 

주어진 데이터가 가질 수 있는 case나 state에 다양성을 주도록 만들고자 한다

 

수집한 데이터가 어떤 환경에서 정확히 찍혔는지 잘 모르겠지만 데이터를 학습한 모델의 사용처를 생각해본다면 데이터에 발생한 noise를 조금은 추출해볼수도 있다???

 

 

 

야외에서 찍힌 이미지는 발생가능한 상황이 밤이나 폭우 폭설같은 경우도 생각해볼 수 있다

 

하지만 사용하려는 데이터에는 이런 예외적인? 상황이 포함되어 있지 않은 경우가 많은데

 

그럼에도 불구하고 밤, 폭우는 충분히 발생 가능한 상황이다

 

 

1-2) idea

 

해당 domain에서 noise를 충분히 고려하여 데이터에 담을 수 있다면

 

나중에 test 과정에서 들어온 데이터들에 대해 모델이 결과를 잘 내줄 수 있지 않을까?

 

domain을 잘 알면 만들어 질 수 있는 다양한 variance를 생각하여

 

data augmentation으로 만들 수 있어서 다양한 이미지를 학습한 효과를 줄 수 있다.

 

모델의 성능이 향상될 것이고 일반화 능력을 줄 것

 

 

1-3) 생각해봐야할 점

 

정의된 문제로부터 해당 이미지가 발생할 수 있는 다양한 상황과 환경을 생각하여 data augmentation을 진행

 

 

flip이라는 변형도 있지만 진짜로 사람이 이렇게 뒤집어서 사람을 찍을 가능성이 있을까?? 생각해보면서 augmentation을 해야한다

 

사실은 flip은 굳이 할 필요가 없을 수 있다 이거지

 

 

1-4) torchvision.transforms

 

random crop, flip, gaussian blur 등 이미지를 변형할 수 있는 함수들이 많이 있다.

 

transforms.Compose에 변형을 원하는 함수를 정의하고 dataset class에서 정의한 self.transform(image)에 그대로 넣으면 변형해준다

 

torchvision.transforms에 사용할 수 있는 다양한 함수들

 

1-5) Albumentations

 

transforms와 다르면서도 더 빠르고 더 다양한 image 변형 함수들을 제공

 

transforms보다 5배에서 10배정도 더 빠르다고 함…

 

albumentations로 변형한 결과?? 사용법 찾아보면 좋을지도?

 

2. data generation은 무엇일까

 

2-1) data feeding

 

dataset을 잘 구성했다고 하더라도 데이터를 모델학습에 효율적으로 어떻게 해야 잘 뽑을 수 있을지

 

feed는 먹이를 준다는 의미로 대상의 상태를 고려해서 적절한 양의 먹이를 주는 것

 

어떤 제품을 만드는 공장이 설계 > 제작 > 포장의 공정을 거친다.

 

주문 요청은 많이 들어오는데 물량이 안나오는 상황에 공장장의 해결책은?

 

제작을 늘린다면 물량이 많이 나오지 않을까?

 

 

조금만 생각해본다면 제작을 많이해도 그에 맞게 포장을 빠르게 해야 실제로 나오는 제품의 수와 양이 증가함

 

제작을 많이해도 포장을 빨리 못하면 아무 의미가 없다는 이야기

 

누구나 생각할 수 있지만 전체적인 과정을 이해하지 못해 나온 실수

 

 

2-2) 모델 학습에서 범할 수 있는 실수란?

 

모델의 성능을 고려하여 데이터를 준다면 효율을 엄청나게 끌어올릴 수 있을 것임

 

모델은 보통 변하지 않는 이상 처리량은 일정하다고 보면 됨

 

GPU를 바꾸면 늘어날 수 있지만 현실적으로도 GPU를 바꾸는 것은 드물다

 

그러면 변하는 부분은 data generator인데 generator가 모델의 처리 성능보다 덜 준다면(제작속도가 포장속도를 따라가지 못한다면)?

 

아무리 모델이 성능이 좋아도 성능보다 덜 쓰는데 비효율적임

 

모델 성능보다 더 많은 데이터를 준다면 최소한 모델의 최대 성능은 끌어올릴 수 있다는 점이 중요함

 

data generator와 모델 처리 성능의 관계

 

적어도 model의 처리량만큼 data generating을 할 수 있는지가 관건이다.

 

그렇지 못한다면 GPU를 비효율적으로 사용하는 것이나 마찬가지

 

 

3. transform 함수를 신중하게 사용해야하는 이유

 

transform 전처리 함수에 따른 300번의 iteration에서 데이터 생성능력을 비교

 

random rotation은 사실 회전만 시키면 끝인데

 

재미있는 부분은 resize를 먼저하고 random rotation을 하느냐,

 

random rotation을 먼저하고 resize를 하느냐에 따라 2배의 속도차이가 난다.

 

resize같은 것은 크기를 키워서 계산량에 직접적으로 영향을 미친다.

 

resize를 하기 전에는 random rotation이 상대적으로 부담이 적으나

 

resize를 하고나서는 이미지 자체가 커져서 random rotation도 부담으로 다가온다.

 

 

transform 전처리 함수에 따른 데이터 생성능력 비교

 

tqdm은 for문 반복문에서 진행 상태바를 표시해줌

 

위의 결과는 transforms.Compose에 생각없이 전처리 함수를 넣는 것이 아니라 신중하게 넣어야한다는 것을 보여준다.

 

 

4. tqdm 라이브러리

 

for문 같은 반복문에서 진행 상태바를 표시해주는 라이브러리

 

사용법도 간단한 것이 for i in tqdm(~~~):으로 in에 해당하는 부분에 감싸주면 끝

 

import tqdm으로 하면 tqdm.tqdm()

 

from tqdm import tqdm하면 tqdm()

 

 

혹은 뭐 from tqdm.auto import tqdm 이게 지금은 제일 좋은듯?

 

https://lv99.tistory.com/80

 

jupyter notebook/lab colab에서 지저분한 tqdm을 깔끔하게 출력하기!

from tqdm import tqdm for images, targets, image_ids in tqdm(holdout_loader, total=len(holdout_loader)): 위의 코드처럼 tqdm loop을 만들어서 돌리면 아래와 같이 무식하게 출력된다. 이 문제를 해결하는 법은 매우 단순하

lv99.tistory.com

 

TAGS.

Comments