관리 메뉴

HAMA 블로그

Caffe - Fine Tuning 본문

통계 & 머신러닝 & 딥러닝

Caffe - Fine Tuning

[하마] 이승현 (wowlsh93@gmail.com) 2016. 3. 15. 11:41

“Flickr Style” 데이터를 이용한  스타일 인식을 위해 CaffeNet 모델을 파인튜닝해보자.


파인튜닝은 이미 학습된 모델을 기반으로  / 아키텍처를  새로운 목적으로 변형하고  /  이미 학습된 모델 weights 로부터 학습을 업데이트한다. BVLC-distributed CaffeNet 모델을 통한 100가지 객체 카테고리 인식을 대신해서 20 가지 이미지 스타일을 예측 하기위해  다른 데이터셋 ( Flickr Style ) 을 이용하여  파인튜닝해보자.

설명

스타일 데이터셋의 Flickr 이미지들은 보기에는 이미지넷 데이터셋 (bvlc_reference_caffenet 모델) 과 매우 유사하다. caffenet 모델은 개체분류에는 잘 작동하며, 우리는 그것을 우리의 스타일 분류에도 이용하고싶다. 우리의 목적에 맞게  학습하기 위한   80,000 개의 이미지들을 가지고있으며, 1,000,000 개의 이미지넷 이미지상에서 학습된 파라미터들을 가지고 파인튜닝을 시작할것이다. 만약 우리가 weights 인자를 caffe train 명령어에 제공하면 이전에 학습된 weights 는 우리의 모델안으로 로딩될것이며, 이름에 의해 레이어들이 매칭될것이다.  즉 이전에 학습된 모델 기반으로 새로운 데이터 분류기가 만들어질것이다.

우리는 기존 1000가지 분류를 대신해서 20 개의 스타일 분류를 예측할것이다. 우린 모델에서 마지막 레이어를 바꿀 필요가 있으며,  마지막 레이어의 이름을 fc8  에서 fc8_flickr 로 prototxt 에서 바꿀것이다.  bvlc_reference_caffenet 에 레이어 에 fc8_flickr 라는 레이어의 이름이 없기때문에 ,  이 레이어는 랜덤 weights 와 함께 학습이 시작될것이다.

우리는 또한 전반적인 learning rate (base_lr)  을  solver prototxt 에서 줄일것이나, 새롭게 소개된 레이어상에서 lr_mult 는 증가 시킬 것 입니다.  이 아이디어는  모델의  변화가 매우 천천히 새로운 데이터와 함께 하게 하지만,  새로운 레이어 학습은 빠르게 할 것입니다. 게다가, 우리는 솔버안에 있는  stepsize 를 scratch 로부터 학습했던것 보다는 더 작은 값으로 조정할것입니다.  since we’re virtually far along in training and therefore want the learning rate to go down faster. 우리는 전체적으로 모든 레이어의 파인튜닝을 막기위해 그들의 lr_mult 를 0으로 세팅할수 있습니다.

진행 순서

모든 절차(실행)는 caffe 설치 루트 디렉토리에서 수행됩니다.

데이터셋은 상응하는 라벨들과 함께 URLs 의 리스트로 표시됩니다. 해당 스크립트(assemble_data.py) 를 사용하여 우리는 데이터의 서브셋을 다운로드 받고 그것들을 train 과 val 셋으로 나눌것입니다.

caffe % python examples/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486
Downloading 2000 images with 7 workers...
Writing train/val for 1939 successfully downloaded images.

이 스크립트는 이미지들을 다운로드하고 train/val 파일 리스트를 data/flickr_style 폴더에 쓸 것입니다. 예제 안의 prototxts 는 이것이 존재한다고 가정할것이며, imageNet mean 파일의 존재를 가정할 것입니다. (혹시 없으면 data/ilsvrc12  폴더의   get_ilsvrc_aux.sh 를 이용해서 다운받으세요.)   

우리는 또한 ImageNet-trained 모델(models/bvlc_reference_caffenet.caffemodel) 이 필요할것이며, 만약 없다면 ./scripts/download_model_binary.py 를 통해 얻으세요.

이제 우린 학습할수 있게 되었습니다!! ( 당신은 CPU 모드로 파인튜닝을 할것입니다. (-gpu 플레그 제거)

caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0

[...]

I0828 22:10:04.025378  9718 solver.cpp:46] Solver scaffolding done.
I0828 22:10:04.025388  9718 caffe.cpp:95] Use GPU with device ID 0
I0828 22:10:04.192004  9718 caffe.cpp:107] Finetuning from models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

[...]

I0828 22:17:48.338963 11510 solver.cpp:165] Solving FlickrStyleCaffeNet
I0828 22:17:48.339010 11510 solver.cpp:251] Iteration 0, Testing net (#0)
I0828 22:18:14.313817 11510 solver.cpp:302]     Test net output #0: accuracy = 0.0308
I0828 22:18:14.476822 11510 solver.cpp:195] Iteration 0, loss = 3.78589
I0828 22:18:14.476878 11510 solver.cpp:397] Iteration 0, lr = 0.001
I0828 22:18:19.700408 11510 solver.cpp:195] Iteration 20, loss = 3.25728
I0828 22:18:19.700461 11510 solver.cpp:397] Iteration 20, lr = 0.001
I0828 22:18:24.924685 11510 solver.cpp:195] Iteration 40, loss = 2.18531
I0828 22:18:24.924741 11510 solver.cpp:397] Iteration 40, lr = 0.001
I0828 22:18:30.114858 11510 solver.cpp:195] Iteration 60, loss = 2.4915
I0828 22:18:30.114910 11510 solver.cpp:397] Iteration 60, lr = 0.001
I0828 22:18:35.328071 11510 solver.cpp:195] Iteration 80, loss = 2.04539
I0828 22:18:35.328127 11510 solver.cpp:397] Iteration 80, lr = 0.001
I0828 22:18:40.588317 11510 solver.cpp:195] Iteration 100, loss = 2.1924
I0828 22:18:40.588373 11510 solver.cpp:397] Iteration 100, lr = 0.001
I0828 22:18:46.171576 11510 solver.cpp:195] Iteration 120, loss = 2.25107
I0828 22:18:46.171669 11510 solver.cpp:397] Iteration 120, lr = 0.001
I0828 22:18:51.757809 11510 solver.cpp:195] Iteration 140, loss = 1.355
I0828 22:18:51.757863 11510 solver.cpp:397] Iteration 140, lr = 0.001
I0828 22:18:57.345080 11510 solver.cpp:195] Iteration 160, loss = 1.40815
I0828 22:18:57.345135 11510 solver.cpp:397] Iteration 160, lr = 0.001
I0828 22:19:02.928794 11510 solver.cpp:195] Iteration 180, loss = 1.6558
I0828 22:19:02.928850 11510 solver.cpp:397] Iteration 180, lr = 0.001
I0828 22:19:08.514497 11510 solver.cpp:195] Iteration 200, loss = 0.88126
I0828 22:19:08.514552 11510 solver.cpp:397] Iteration 200, lr = 0.001

[...]

I0828 22:22:40.789010 11510 solver.cpp:195] Iteration 960, loss = 0.112586
I0828 22:22:40.789175 11510 solver.cpp:397] Iteration 960, lr = 0.001
I0828 22:22:46.376626 11510 solver.cpp:195] Iteration 980, loss = 0.0959077
I0828 22:22:46.376682 11510 solver.cpp:397] Iteration 980, lr = 0.001
I0828 22:22:51.687258 11510 solver.cpp:251] Iteration 1000, Testing net (#0)
I0828 22:23:17.438894 11510 solver.cpp:302]     Test net output #0: accuracy = 0.2356

얼마나 빠르게 loss 가 줄어드는지 확인하자. 23.5% 의 정확도가  하찮아 보일지라도, 그것은 오직 1000번의 반복을 통해서 나온 수치이다. 모델이 빠르고 잘 학습하길 시작하는 증거이다. 일단 모델이 100,000 반복되는 전체 학습 셋상에서 파인튜닝되면 마지막 정확도는 39.16%가 될것이다. 이것은 대략 K40 GPU 상의 Caffe 시스템에서  7시간 정도 걸릴것이다. 

우리가 pre-trained 모델과 함께  하지 않았을때와 비교적 해보면 어떻게 loss 가 줄어지는지 알수있다. 

I0828 22:24:18.624004 12919 solver.cpp:165] Solving FlickrStyleCaffeNet
I0828 22:24:18.624099 12919 solver.cpp:251] Iteration 0, Testing net (#0)
I0828 22:24:44.520992 12919 solver.cpp:302]     Test net output #0: accuracy = 0.0366
I0828 22:24:44.676905 12919 solver.cpp:195] Iteration 0, loss = 3.47942
I0828 22:24:44.677120 12919 solver.cpp:397] Iteration 0, lr = 0.001
I0828 22:24:50.152454 12919 solver.cpp:195] Iteration 20, loss = 2.99694
I0828 22:24:50.152509 12919 solver.cpp:397] Iteration 20, lr = 0.001
I0828 22:24:55.736256 12919 solver.cpp:195] Iteration 40, loss = 3.0498
I0828 22:24:55.736311 12919 solver.cpp:397] Iteration 40, lr = 0.001
I0828 22:25:01.316514 12919 solver.cpp:195] Iteration 60, loss = 2.99549
I0828 22:25:01.316567 12919 solver.cpp:397] Iteration 60, lr = 0.001
I0828 22:25:06.899554 12919 solver.cpp:195] Iteration 80, loss = 3.00573
I0828 22:25:06.899610 12919 solver.cpp:397] Iteration 80, lr = 0.001
I0828 22:25:12.484624 12919 solver.cpp:195] Iteration 100, loss = 2.99094
I0828 22:25:12.484678 12919 solver.cpp:397] Iteration 100, lr = 0.001
I0828 22:25:18.069056 12919 solver.cpp:195] Iteration 120, loss = 3.01616
I0828 22:25:18.069149 12919 solver.cpp:397] Iteration 120, lr = 0.001
I0828 22:25:23.650928 12919 solver.cpp:195] Iteration 140, loss = 2.98786
I0828 22:25:23.650984 12919 solver.cpp:397] Iteration 140, lr = 0.001
I0828 22:25:29.235535 12919 solver.cpp:195] Iteration 160, loss = 3.00724
I0828 22:25:29.235589 12919 solver.cpp:397] Iteration 160, lr = 0.001
I0828 22:25:34.816898 12919 solver.cpp:195] Iteration 180, loss = 3.00099
I0828 22:25:34.816953 12919 solver.cpp:397] Iteration 180, lr = 0.001
I0828 22:25:40.396656 12919 solver.cpp:195] Iteration 200, loss = 2.99848
I0828 22:25:40.396711 12919 solver.cpp:397] Iteration 200, lr = 0.001

[...]

I0828 22:29:12.539094 12919 solver.cpp:195] Iteration 960, loss = 2.99203
I0828 22:29:12.539258 12919 solver.cpp:397] Iteration 960, lr = 0.001
I0828 22:29:18.123092 12919 solver.cpp:195] Iteration 980, loss = 2.99345
I0828 22:29:18.123147 12919 solver.cpp:397] Iteration 980, lr = 0.001
I0828 22:29:23.432059 12919 solver.cpp:251] Iteration 1000, Testing net (#0)
I0828 22:29:49.409044 12919 solver.cpp:302]     Test net output #0: accuracy = 0.0572

이 모델은 학습하기를 첨부터 시작하고 있어서  형편없이 시작된다.

파인튜닝은 처음부터 학습하는게 시간이나 데이터의 부족으로 잘 되지 않을 적합하다.  심지어 CPU 모드에서도 빠르며,  GPU 파인튜닝은 하루나 일주일이 아닌 몇분이나 시간안에 유용한 모델을 학습할 수 있을것이다.  Flickr 스타일 인식처럼 이미지 넷의  기 학습된 모델로 부터 새로운 업무를 학습하게 하는것은 처음부터 학습하는것 보다 적은 데이터를 요구할수있다. 

이제 님들  스스로의 업무와 데이터에 맞추어서  파인튜닝을 해 보자!!

Trained model  학습모델

우리는 80,00개의 이미지상에서 모델을 학습하게 제공한다. 마지막 정확도는 39% 이다.  간단하게 ./scripts/download_model_binary.py models/finetune_flickr_style  를 실행해서 얻을수 있다.

라이선스

Flickr 스타일 데이터베이스는 오직 이미지에 대한 URL 로만 얻을수 있다. 어떤 이미지들은 아마 copyright 가 있을것이다.  연구용/비상업용으로 카테고리-인지모델을 학습시키는것은 이 데이터를 이용하여 가능할것이다. 그러나 결과는 상업적 목적으로 사용되어서는 안된다.



http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html 번역

Comments