Tips)PyTorch 딥러닝(Deep Learining) 탬플릿을 사용해서 손쉽게 학습하기(fine-tuning) + 깃헙코드 O
본문 바로가기
Python

Tips)PyTorch 딥러닝(Deep Learining) 탬플릿을 사용해서 손쉽게 학습하기(fine-tuning) + 깃헙코드 O

by Migos 2019. 11. 29.
반응형

템플릿 개요 및 설명

Pytorch 탬플릿에 대해 알아봅시다.

이 템플릿은 PyTorch를 사용하여 새로운 딥 러닝 컴퓨터 비전 프로젝트를보다 쉽게 시작할 수 있습니다.

주요 특징은 다음과 같습니다. 

 

  • 모듈화(modularity) : 각 논리 부분을 다른 파이썬 서브 모듈로 나눕니다.(dataloader, augmentation 등등)
  • 데이터 확장(data-augmentation) : imgaug 라이브러리를 사용한 데이터 확장.
  • 직관적인 사용(ready-to-go) : poutyne을 Keras틱하게 프레임 워크로 사용하면 train loop를 작성할 필요가 없습니다.(훈련 진행에 관한 기능이 이미 짜여져 있음.)
  • torchsummary : model에 관한 요약정보를 보여줌.
  • 학습률 자동조절(learning rate).
  • 자동모델 저장기능(auto-saving model).
  • comet을 활용한 코드 트래킹(tracking), 시각화.

Motivation

 본 템플릿을 사용하면 범용적으로 코드를 자유자재로 입맛에 맞게 변형해서 쓸 수 있기 때문에 매번 하드코딩하는 시간을 줄일 수 있습니다. 그럼 학습을 위한 전체 코드를 쪼개고 모듈화하는 방법에 대해 알아보고, 이미 학습된 resnet18모델을 Fine-tuning 해서 Darth Vader와 Luke Skywalker를 분류하는 예제를 다뤄보겠습니다.

 

 우선 Google에서 이미지를 검색하여 클래스 당 100 개의 이미지를 다운받습니다. (데이터셋 다운).

그 다음, 동일한 폴더에서 main.py 를 실행하면됩니다.

그리고 resnet18을 미세 조정(fine-tuning)해서 5/10 에포크(Epoch)만에 90 % 이상의 정확도에 도달 할 수 있는지 알아봅시다.

 

우선 사용에 앞서 탬플릿을 clone 하고 ./template 폴더를 만들어 넣습니다.

Keep your structure clean and concise

대부분의 딥러닝 프로젝트는 아래와 같이 세 가지 과정으로 진행됩니다.

  • data gathering/processing
  • modeling
  • training/evaluating

데이터를 다루기 가장 좋은 방법은 내가 원하는 폴더경로에 데이터를 각각 때려넣고 사용하는 방법입니다. 예를들면, dataset folder를 만들고 각 클래스별(ex.강아지, 고양이)로 폴더를 만들어서 해당하는 이미지 혹은 데이터셋을 넣어주는 방법이 있습니다. 그러면 한번만 지정해두면 데이터셋을 불러오는데 별다른 코드작성 없이 손쉽게 할 수 있습니다. 또한, 데이터 하나하나를 변경하기도 용이한 장점이 있습니다.(직관적이기도 하죠^^) 

Project.py 파일을 보면 data_dir 변수와 checkpoint_dir 변수가 있는데요. 데이터경로와 학습모델의 경로를 손쉽게 연결하고 다루기 쉽게 코드가 짜여져 있습니다.

 

예를들어, 만약 데이터 경로를 알고싶으면:

from Project import project

print(project.data_dir) # /user/Desktop/.../dataset

 

그 다음, torch.utils.data.Dataloader 클래스를 불러와서 보다 쉽게 커스텀 데이터셋과 함께 유기적으로 이용할 수 있습니다.

 

Transformation

보통 학습을 위해 이미지를 리사이징하고, Data augmentation 하기 위한 전처리/변형과정이 필수적으로 이루어지죠.

이 템플릿에는 imgaug 라이브러리를 사용해서 전처리를 위한 모든 코드가 짜여져 있습니다. 그리고 데이터셋 전처리과정은 /data/transformation/ 폴더 안에서 이루어 지게 됩니다.

 

Dataloaders

보통 데이터를 모델에 넣어주기 위해서 Dataloader를 사용하지만, data폴더에 있는 __init__.py 파일에 get_dataloaders 함수를 사용하면 자동으로 train, val, test셋으로 나눠주는 기능을 사용할 수 있습니다.

 

 

Losses

커스텀 loss를 만들고싶으면, ./losses 폴더에 __init__.py 를 수정해서 사용하면 됩니다.

Fine-tuning

자 그럼 pre-trained resnet18 을 불러와서 fine-tuning하기 위해 resnet_finetune 함수를 사용한 후 resnet18로 재 정의 해줍니다.

  • 모델 가중치(weight) 동결(freeze) >> param.requires_grad = False 처리
  • 최종 레이어 지우고 원하는 클래스 수(classes)로 대체 (Darth Vader와 Luke Skywalker를 분류하는 예제이므로, 2)

 

 

마지막으로, 훈련(training)과 평가(evaluation) 과정은 main.py 에서 진행됩니다.

poutyne 라이브러리를 이용하면 학습 진행에 필요한 같은 유용한 기능을 사용할 수 있습니다.

  • learning rate scheduler
  • auto-save of the best model
  • early stopping

Track your experiment

모델 학습결과를 살펴보기 위해서 comet을 사용합니다.

 

main.py를 실행하면 다음과 같은 결과가 나오는 것을 확인할 수 있습니다.

맨 마지막 Linear-68 부분을 보면 최종 클래스는 2로 확인되는 것을 알 수 있음.

 

 

원문은 아래 링크를 참조하시면 됩니다.

https://towardsdatascience.com/pytorch-deep-learning-template-6e638fc2fe64

 

PyTorch Deep Learning Template

A clean and simple template to kick start your next dl project 🚀🚀

towardsdatascience.com

 

github code : https://github.com/FrancescoSaverioZuppichini/PyTorch-Deep-Learning-Template/tree/master

 

FrancescoSaverioZuppichini/PyTorch-Deep-Learning-Template

A Pytorch Computer Vision template to quick start your next project! 🚀🚀 - FrancescoSaverioZuppichini/PyTorch-Deep-Learning-Template

github.com

 

반응형

댓글