본문 바로가기
Project/Image Classification Pipeline Project

5. Pytorch 텐서보드 활용 & image augmentation 중요성-실험 결과(이미지 수집부터 분류 모델까지)

by inhovation97 2021. 7. 5.

이 포스팅은 아래 흐름대로 진행되는 포스팅입니다.

데이터 수집 - 전처리 - 모델링 - 성능 개선

 

이번 포스팅은 tensorboard를 활용하여 여러 가지를 시각화하여 학습 효율을 높여보겠습니다.

 

일전에 각각 다른 라이브러리로 전처리했던 데이터를 서로 비교해보겠습니다!

저도 결과보고 놀랐네요!

 

이전 포스팅 링크

[pytorch 라이브러리를 이용한 이미지 전처리]  vs [albumentations 라이브러리를 이용한 이미지 전처리]

 

포스팅 순서

< 텐서보드를 활용해보자! >

1. 텐서보드에 학습 이미지 올리기
2. 텐서보드로 모델 아키텍쳐 시각화
3. 텐서보드를 활용해 실시간 학습 상황 확인 & 두 데이터셋 비교

티스토리 코드 가독성 때문에 먼저 코드 파일을 공유합니다. (주석도 잘 달아놓음)

코랩으로 열기를 권장합니다.

https://github.com/inhovation97/personal_project/blob/main/pytorch/pytorch_project_Comparing_Image_preprocessing.ipynb

 

 

 

 

< resnet50을 구현해보자!>

 

 

1. 텐서보드에 학습 이미지 올리기

 

visdom이라는 시각 툴도 있는데 tensorboard처럼 유연하고 다양하진 않은 것 같습니다.

아 그리고 제 환경은 colab입니다! 

주피터나 다른 환경은 조금 달라서 pip으로 라이브러리를 다운받고 커맨드창을 이용해야 할겁니다.

 

 

colab은 따로 라이브러리를 다운받지 않아도됩니다.

SummaryWritersummary를 임포트해줍니다.

그리고 runs 경로를 SummaryWriter로 올려줍니다.

바로 여기 runs에 이미지를 올리고 모델 아키텍쳐를 시각화 할 겁니다.

 

 

정의했던 dataloader를 iter형식으로 만들고, image와 label을 분리해줍니다.

분리한 iamge로 grid형태로 만든 뒤에 이것을 텐서보드에 기록해주는겁니다.

그렇게 매직 커맨드로 텐서보드의 runs 경로를 부르면, 이렇게 아래처럼 이미지가 등록된 것을 확인할 수 있습니다. 

dataloader에서 설정한 batchsize만큼 이미지가 로드됩니다.

 

 

2. 텐서보드로 모델 아키텍쳐 시각화

 

이건 더 쉽습니다.

그냥 witer 함수로 model과 위에서 정의한 images를 인자로 넣어주면됩니다.

아까 부른 텐서보드에서 오른쪽 위 빨간 동그라미부분을 GRAPH로 가면 모델이 시각화돼있습니다.

뭔가 허접해보이지만 layer 하나 하나 전부 시각화 돼있습니다.

 

이렇게 layer 내부도 전부 볼 수 있고, 계산된 feature map 사이즈도 알려줍니다.

이미지 다운로드도 제공하니 진짜 좋은 것 같아요.

 

 

 

3. 텐서보드를 활용해 실시간 학습 상황 확인 & 두 데이터셋 비교

 

저는 runs경로가 아닌 따로 logs 경로를 만들어서 새로운 학습 텐서보드 창을 만들었습니다.

같은 경로로 지정해도 됩니다.

지정한 경로에 학습 데이터(loss나 epoch, accuracy 등등)을 올려줄 파일을 저렇게 summary 함수로 만들어줍니다.

 

그리고 이렇게 train/test코드에 if문을 걸어 일정 epoch나 step마다 loss값과 accuracy값을 텐서보드에 scalar로 추가해줍니다.

텐서보드를 열면 실시간으로 학습 데이터가 시각화됩니다!

 

이전 포스팅을 보시면 아시겠지만 저는 같은 이미지들로 데이터셋을 2개 만들었습니다.

 

하나는 torchvision을 이용해 전처리를 실행한 데이터셋 (링크)

이놈은 normalization을 지정해주었고, torchvision의 image augmentation을 해주었죠.

 

나머지는 albumentations를 이용해 전처리를 실행한 데이터셋 (링크)

얘는 확률도 지정할 수 있을 정도로 유연하고 빠르고 다양한 image augmentation을 지원해줍니다. 

 

두 데이터셋의 하이퍼 파라미터는 batch size : 64 & learning rate : 0.0025 & epochs : 150

Adam optimizer로 같은 조건에서 학습시킨 뒤 텐서보드로 비교해보았습니다!

 

 

 

train&test loss
두 데이터셋 accuracy 비교

텐서보드 이용하면 이렇게 깔끔하게 loss & acc가 트래킹됩니다!

 

결과보고 놀랐습니다.

torchvision 데이터셋으로 학습한 모델은 전혀 학습이 되지않고 과적합만 계속 이루어집니다. (파라미터를 아무리 바꿔봐도 학습이 전혀 되지 않았습니다.)

 

반면에 albumentations를 이용한 데이터셋은 학습이 훨씬 잘 이루어져 loss를 줄여나가 accuracy 60% 넘게 성능을 냈고, 2k step 정도부터는 과적합이 됐습니다.

(포스팅으로 일 다저질러놓고 처음에 acc가 반도 안나와서 절망적이었는데, 이렇게 흥미로운 결과가 나올 줄은 몰랐습니다 ㅋㅋ)

 

이전 포스팅에서 직접 데이터를 크롤링했기때문에 데이터 수가 작아서( train: 1049장) data augmentations가 굉장히 중요하다고 언급했었는데, 이 정도로 크게 차이날 줄은 몰랐네요!

아마도 model 내부에서 albumentations로 전처리한 데이터셋의 데이터가 훨씬 다양하다고 여겨진 것 같네요.

 

파이토치에서는 해줬던 color jitter가 albumentations에는 잘 안되길래 빼고 진행해서 걱정했는데,

아마 이미지도 전부 바닷속이고, 범고래, 고래상어, 벨루가 정도를 제외하고는 색깔이 전부 비슷해서 color jitter보다는 이미지의 회전이나 noise가 엄청 유효했나봅니다!

 

아 그리고 image normalization은 전자 데이터가 아예 학습되지 않아서 비교가 무의미했네요...

 

 

혹시 하이퍼 파라미터의 설정이 익숙하지 않으신 분들은 이 글을 추천드립니다. 크게 도움이 되실거예요!

 

Learning rate & batch size best 조합 찾기 (feat.논문리뷰와 실험결과)

이번 포스팅은 저의 지난 포스팅의 배경 지식이 요구되므로 읽고 오시기를 추천드립니다 :) 저는 모델링 경험이 엄청 많지는 않기 때문에 고수분들에게는 해당 포스팅이 당연한 인사이트일 수

inhovation97.tistory.com

 

 

이제 드디어 이미지 수집부터 분류 모델까지 시리즈 포스팅이 막바지입니다!

다음 포스팅은 imagenet으로 pretrain된 resnet50의 가중치를 가져와 finetuning하여 모델의 성능을 올려보는 시도를 해보겠습니다!

댓글