예제에서 함수 train_model 코드 부분 이해가 어려운 편이다. 어떤 모델을 사용할 것인지 여부는 models 라이브러리가 제공하는 범위 내에서 즉 AlexNet, Inception, VGGNet, ResNet을 포함하는 9가지 종류 중에서 선정이 가능하다. 특히 9종의 각 모델 별로 Fine Tuning 시키기 위한 예제 코드는 아래 url 주소에 예제로 제시되어 있으니 별도로 참조하자.
Finetuning Torchvision Models
https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html
모델이 선정되었으면 train_model 함수의 입력 argument로 제공하도록 하자. 입력된 model은 함수 내부에서는 클라스 명령으로 여러 번 참조함을 아래 그림에서 알 수 있다. 처음 시작 단계에서 model.state_dict() 명령을 참조함으로서 지정된 모델의 사전 학습된(Pretrained) 웨이트 매트릭스 값을 그대로 받아와 케시 메모리에 저장하고 학습 초기 값으로 삼는다. 아울러 학습 시작 처 단계에서 정밀도 best_acc 는 0.0 으로 설정한다.
한편 학습과정에서 dropout 기법을 사용하게 되면 학습과정 레이어들에서 뉴론들 연결 상태와 테스트(evaluation) 시의 뉴론 연결 상태 및 비율이 달라지므로 미리 train()모드와 eval()모드를 따로 설정해야 한다. 아울러 학습과정에서는 train_model 호출 시에 넘겨받는 learning rate schedule 정보에 따라 학습과정에 한해서만 scheduler.step()을 설정할 필요가 있지만 테스트 시에는 필요 없다는 점에 유의하자.
예제에서 불러 쓰는 모델은 가장 작다고 여겨지는 ResNet18이다. 어떻게 출력했는지 알 수 없으나 튜토리얼에 의하면 마지막 fully connected(fc) 레이어에서 웨이트 매트릭스 사이즈가 512X1000 임을 알 수 있다.
만약 사용자가 소량의 이미지 입력 데이터를 준비하여 학습과 테스트를 실행한다면 원래의 ResNet18 학습 결과를 사용하여 1000 종류의 확률을 계산 후 종류별로 확률이 높은 top 5 종류를 체크해야 하므로 컴퓨팅 부담이 만만치 않다. 그보다는 사용자의 입력 데이터 량이 작을 경우에는 대규모로 사전 학습된 지정된 모델의 웨이트 매트릭스 값을 가져다가 Stochastic Gradient Descent 옵티마이저로 추가 학습을 시킨다고 해도 전체 웨이트 매트릭스의 값 변동은 미미할 것이다. 이것이 바로 Fine Tuning 방식 Transfer Learning 알고리듬의 핵심에 해당한다. Fine Tuning 기법에서는 ResNet18의 사전 학습 웨이트 매트릭스를 초기 값으로 사용하면서 소량의 사용자 샘플을 입력하여 fully connected 레이어 구조를 리모델링하여 학습을 계속 진행할 경우에는 Backpropagation 계산이 일어나므로 전체적으로 웨이트 매트릭스 값들이 변동될 수도 있을 것이다.
반면에 아예 사전 학습된 지정된 모델의 웨이트 매트릭스 값을 고정시킨 상태에서 즉 Backpropagation을 허용하지 않는 상태에서 fully connected 레이어 부분만을 리모델링하여 학습시키는 패턴이 바로 Fixed Feature Extractor 기법으로 사전 학습 웨이트 매트릭스 값 부분의 변동이 없으므로 컴퓨팅 시간 부담을 많이 줄일 수 있다.
튜토리얼 계산 결과에 의하면 Fine Tunning의 경우 67초에 96% 의 정확도를 보여 주며 Fixed Feature Extractor의 경우 35초에 95%의 정확도를 주고 있다.
한편 소량의 2종류 즉 개미와 벌 사용자 샘플을 입력하여 1000종으로 Classification 작업을 하는 경우에 top 5 확률 값을 조사해 볼 경우에 비해서 아예 2종으로 최종 계산을 마무리 짓는 경우 후자의 경우에 어느 한쪽의 확률이 예를 들자면 90% 이상으로 높아야 할 것이다.