pytorch에서 data augmentation은 어떻게 이해해야하는가

data augmentation 설명하면 항상 이렇게만 설명함

 

“image를 랜덤하게 자르거나 확대하거나 축소하는 등 변형하여 데이터 수를 의도적으로 늘려 머신러닝 모델이 다양한 데이터를 학습하도록 유도함”

 

그런데 나는 항상 이런 생각을 했음

 

“data augmentation에서 augmentation의 뜻이 증강임..”

 

이 설명은 가지고 있는 data set을 증가시킨다는 느낌을 줌

 

그래서 처음에 augmentation 한번 구현해볼까? 하고 생각한게 transforms.Compose로 transform을 정의하고

 

 

 

torchvision의 transform이 제공하는 함수를 이용하여 이미지를 변형시켜 데이터를 읽어온다

 

이렇게 변형된 이미지 데이터셋을 처음부터 순회해서, label별로 tensor를 다시 이미지로 만들어서 새롭게 저장.

 

 

 

imagefolder로 읽어들인 object에서 iteration을 통해 데이터를 다시 저장한다

 

torchvision.utils.save_image를 이용해서 tensor를 이미지로 저장해야한다

 

(증강하기 전) 85%

 

 

 

 

(증강 후) 75%로 성능도 떨어지긴함..

 

 

 

 

근데... 아무도 이렇게 안하더라고?...

 

성능이 떨어지는건 그렇다치더라도.. 실제로 이렇게 데이터를 '증강'시키지는 않는다

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

나도 항상 의아해 했던 것은 transform.compose를 사용해서 변형시키는 것까지는 했는데 그 누구도 data를 증가시키지도 않았음

 

그래서 나는 변형시킨 데이터를 가지고 있는 데이터에 다시 합쳐서 데이터를 늘려야 하는 줄 알았는데 그 누구도 그렇게 안함

 

그러면 그걸 왜 augmentation이라고 부르??? 드디어 이 의문을 오늘 해결했다…

 

----------------------------------------------------------------------------------------------------------------------------------

 

pytorch같은 경우 augmentation을 transform 함수를 사용하는 것이 잘 알려져있음

 

transform이 2가지 경우가 있는 것임

 

하나는 주어진 데이터에 반드시 적용시키는 data preparation과

 

주어진 데이터에 random하게 적용하는 data augmentation

 

training을 할 때 어떤 식으로 하냐면

 

dataloader에서 batch만큼 데이터를 가져와서 transform이 있으면 transform을 적용시켜서 batch 훈련을 준비하는데

 

transform에는 데이터에 100% 반드시 적용하는 transform이 있고 random한 확률로 적용하는 transform이 있다는거임

 

예를 들어 transforms.ToTensor()는 가지고온 이미지 batch를 전부 tensor로 반드시 바꿈

 

transforms.RandomResizedCrop(224)는 가지고온 이미지 batch에서 이미지의 랜덤한 영역을 잘라서 224*224로 만드는 것임

 

랜덤한 영역을 잘라서 224*224로 반드시 만드는것임 랜덤하게 적용하냐 안하냐가 아니라

 

이런 함수들이 data preparation이다.

 

사실 transforms.RandomResizedCrop(224)도 batch image마다 랜덤한 영역에 적용되다보니 이 자체로도 data augmentation 효과를 가지겠지

 

--------------------------------------------------------------------------------------------------------------------------------------------

 

그러나 transform 중에는 일정한 probability로 주어진 이미지 batch에 적용하냐 마냐 만드는 transform이 있다는 거

 

transforms.RandomGrayscale()은 가지고 온 이미지 batch를 p의 확률로 grayscale로 바꿔서 train으로 사용하거나

 

1-p의 확률로 grayscale로 바꾸지 않고 원본 그대로 사용함

 

 

 

랜덤한 확률로 이미지 batch에 적용해서 train에 사용을 하느냐, 아니면 원본을 그대로 사용하느냐가 중요한 포인트임

 

training을 하면 iteration을 여러번 하잖아.. 그러니까 batch data가 여러번 반복해서 가지고 온단 말이지

 

random한 확률로 batch data에 적용하는 함수를 사용한다면

 

어떤 iteration에는 transform된 데이터를 사용해서 train을 하거나

 

다른 iteration에는 transform되지 않은 original data를 사용해서 train을 한다는 것임

 

여기서 또 하나 중요한 포인트는

 

결국에는 전체 데이터를 증가시키지 않고도 증가된 데이터를 사용하여 training을 하는 효과를 가질 수 있다는 것임

 

전체 데이터를 증가시키지 않는다는 점은 메모리 절약에 장점을 가진다.

 

이것이 바로 data augmentation을 "진짜로"이해하는 방법이다.

 

TAGS.

Comments