읽기일기

Transfer Learning tutorial

http://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html

Transfer Learning tutorial

작성자: Sasank Chilamkurthy

이 튜토리얼에서는 transfer learning을 이용하여 어떻게 네트워크를 학습시키는지를 배울 것입니다. Transfer learning에 대해서는 cs231n 강의노트를 참고하세요.

강의노트를 인용해보겠습니다.

실제로는 컨볼루셔널 네트워크를 처음부터 학습시키는 사람은 아주 극소수입니다. 충분한 크기의 데이터셋을 가진 사람은 상대적으로 적기 때문입니다. ConvNet을 ImageNet같이 큰 데이터셋에서 선학습(pretrain)한 다음, 그 ConvNet을 초기 상태로 사용하거나 우리가 관심있는 작업을 위한 특징 추출기로 고정해놓고 사용하는 것이 일반적입니다.

그에 따른 두가지 transfer learning 큰 시나리오는 다음과 같습니다.

  • ConvNet의 파인튜닝 : 랜덤 초기화를 하는 대신 ImageNet 1000 데이터셋과 같은 데이터에서 선학습된 네트워크로 초기화로 사용하고 그 뒤의 학습을 진행하는 것
  • 특징 추출기로써의 ConvNet : 마지막 fully connected 층을 제외한 나머지 모든 네트워크의 가중치를 고정시킨 뒤, 마지막 fully connected 층을 새로운 랜덤 가중치로 초기화 한 뒤, 이 층만 학습하는 것

Load Data

torchvision과 torch.utils.data 패키지를 이용해서 데이터를 로딩해보겠습니다.

여기서 해결하려는 문제는 개미을 분류하는 모델을 학습시키는 것입니다. 120개 정도의 개미와 벌 학습 이미지를 가지고 있습니다. 또 각각 75개의 검증용 이미지도 가지고 있습니다. 보통 처음부터 학습려는 상황이라면, 일반화(generalize)를 하기에는 매우 적은 수의 데이터셋입니다. 하지만 transfer learning을 사용할 것이기 때문에 잘 generalize할 수 있습니다.

사실 이 데이터셋은 imagenet의 일부입니다.

Note: 데이터를 여기에서 다운로드받아 현재 디렉토리에 풀어놓습니다.

Visualize a few images

이제 데이터 augmentation을 이해하기 위해서 약간의 트레이닝 이미지를 출력해봅시다.

Training the model

이제 모델을 학습하기 위한 함수를 작성해봅시다. 다음의 것들을 설명하도록 하겠습니다.

  • 학습률(learning rate)의 스케쥴링
  • 가장 좋은 모델을 저장

다음 나올 소스에서 scheduler파라미터는 LR 스케쥴러 객체로 torch.optim.lr_scheduler에서 나온 것입니다.

Visualizing the model predictions

약간의 이미지에서 예측한 결과를 출력하는 함수를 작성합시다.

Finetuning the convnet

선학습된 모델을 불러온 뒤, 마지막 fully connected 층을 초기화합니다.

Train and evaluate

CPU로 실행하면 15-25분 정도, GPU에서는 1분 이내의 시간이 걸립니다.

Out:

ConvNet as fixed feature extractor

이제 마지막 층만 제외하고 나머지는 고정시켜보도록 하겠습니다. backward()를 실행할 때 그래디언트를 계산하지 않도록 파라미터를 고정시키려면 requires_grad = False으로 설정해야 합니다.

더 많은 정보는 문서에서 볼 수 있습니다.

Train and evaluate

CPU에서 실행하면 이전의 시나리오의 반 정도밖에 시간이 걸리지 않습니다. 이것은 네트워크의 대부분에서 그래디언트를 계산할 필요가 없기 때문입니다. 하지만 순전파는 계산되어야만 합니다.

Out:

 


Tags:
Add a Comment Trackback