Skip to content

Caffe Example : 4.Fine tuning CaffeNet for Style Recognition on “Flickr Style” Data (Kor)

HanJiHoon edited this page Dec 28, 2016 · 3 revisions

플리커 스타일 데이터에 대한 스타일 인식에 대한 CaffeNet 조율하기(Fine-tuning CaffeNet for Style Recognition on “Flickr Style” Data)

잘 조율 시키는 것은 이미 학습된 모델에서 사용되고, 구조에 적용되어있으며, 이미 학습된 모델의 가중치에로부터 학습시키는것을 재개시킨다. 이제 오브젝트 카테고리 대신에 이미지 스타일을 예상하기 위해 플리커 스타일의 다른형식의 데이터세트에 대한 BVLC에서 유통하는 CaffeNet 모델을 잘 조율해보자

설명(Explanation)

플리커 기반의 이미지 스타일 데이터 세트는 시각적으로 이미지망 데이터 세트와 매우 유사하며 이는 bvlc_reference_caffenet에 학습되어 진 것이다. 이러한 모델이 오브젝트 카테고리 분류화에 있어 잘 작동하기 때문에, 우리는 우리의 스타일 분류를 위해 이 구조를 사용하기를 선호한다. 우리는 또한 학습하기위한 80,000개의 이미지들만 있어서, 우리는 이미지망의 1,000,000 이미지망 이미지로 학습된 파라미터로 시작하는게 좋다. 필요하다면 잘 조율하자. 만약 우리가 Caffe 학습 명령어에 가중치 언급을 한다면, 사전에 학습된 가중치가 우리의 모델속에 이름에 의한 계층을 맞추면서 불러와질 것이다.

우리는 1000개 대신 20개의 클래스로 예상하기 때문에, 우리는 모델에 있는 종단계층를 바꿔줄 필요가 있다. 그러므로, 우리는 우리의 prototxt에 fc8를 fc8_flickr로 종단 계층의 이름을 바꾼다. bvlc_reference_caffenet에는 이런 이름의 계층이 없으므로 이런 계층은 무작위 가중치로 학습을 시작할 것이다.

우리는 또한 해결사 prototxt에 전체 학습율 base_lr를 줄일것이지만, 새롭게 생산된 계층에대한 lr_mult는 가속시킬 것이다. 이런 생각은 새로운 데이터에 대해서는 매우 느리게 기존 모델 일부만 변화하겠지만, 새로운 계층이 빠르게 학습을 하게끔해준다. 추가로, 우리는 스크레치로부터 학습할지 안할지 보다는 낮은 값으로 해결사 속의 stepsize를 설정하는데, 우리는 시각적으로 학습율을 많이 따라가기 때문에 그러므로 학습율을 더 빠르게 하락시키기를 원한다. 우리는 또한 lr_mult를 0으로 설정해서 fc8_flickr보다는 전체적으로 전체 계층의 잘 조율시키는 것을 예방할수있음을 알아두어라.

처리(Procedure)

모든 과정은 Caffe root directory에서 작업된다. 데이터세트는 상응하는 라벨로 URL의 리스트로써 배급된다. 스크립트를 사용해서, 우리는 데이터의 작은 서브셋을 다운로드 받고, 이를 학습데이터와 유효데이터로 나눌것 이다.

caffe % ./examples/finetune_flickr_style/assemble_data.py -h
usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS]

Download a subset of Flickr Style to a directory

optional arguments:
  -h, --help            show this help message and exit
  -s SEED, --seed SEED  random seed
  -i IMAGES, --images IMAGES
                        number of images to use (-1 for all)
  -w WORKERS, --workers WORKERS
                        num workers used to download images. -x uses (all - x)
                        cores.

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.

이 스크립트는 이미지를 다운받고 data/flickr_style속에 train/val 파일로 쓰여진다. 이 예제속 prototxt는 이를 가정하고, 또한 이미지망 평균 파일이 있다고 가정한다.(아직 없다면, data/ilsvrc12에서 get_ilsvrc_aux.sh를 실행하라)

우리는 또한 이미지망으로 학습된 모델이 필요한데, 이는 우리가 ./scripts/download_model_binary.py models/bvlc_reference_caffenet.를 실행시켜서 얻을수 있다.

이제 우리는 학습시킬 수 있다! 잘 조율시킨다는 것의 핵심은 아래 명령어에 -weights 언급을 붙이는 것이며, 이는 Caffe에게 우리가 사전에 학습된 카페모델로부터 가중치를 불러오기를 원한다는 것을 말해준다.

(-gpu 플래그를 떠나서 우리는 cpu 모드에서 조율시킬 수 있다.)

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

어떻게 빠르게 손실이 내려가는지 보아라. 비록 23.5%의 정확도가 고작이지만, 이는 오직 1000번만 반복했으며, 모델이 빠르고 잘 학습하기 시작했다는 것의 증거이다. 한번 모델이 전체 학습 세트 약 100,000번 반복에 대해 완벽히 잘 조율되기만 하면, 마지막 유효 정확도는 39.16%이다. 이는 K40 GPU를 사용한 caffe상에 7시간 미만이 걸린다.

비교를 위해, 여기 사전 학습된 모델로 시작하지 않을 때에 손실이 어떻게 감소되는가를 보여준다.

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모드에서는 각각 과정들을 동해 학습세트가 100개 이하를 취한다. GPU에서 잘 조율시키는것은 당연하지만 여전히 더 빠르고 몇일 혹은 몇주 대신 몇시간 몇분에 있어 더 효율적인 모델을 학습한다. 더 나아가, 모델은 오직 2000개 이하의 경우에서만 학습을 한다는 점을 알아두어라. 이미지망 사전 학습으로부터 스타일 인식같은 새로운 업무를 학습으로 전환하는것은 스크래치로부터 학습하는것 보다 더 적은 데이터를 요구할 수 있다.

이제 당신만의 업무와 데이터에 대해 잘 조율시켜보아라.

학습된 모델(Trained model)

우리는 39%의 최종 정확도를 가진 모든 80K 이미지에 대하여 학습된 모델을 제공한다. 간단히 ./scripts/download_model_binary.py models/finetune_flickr_style를 실행시켜서 이를 얻을 수 있다.

라이센스(license)

여기서 유통하는 플리커 스타일의 데이터 세트는 오직 이미지를 URL에서만 얻을수있다. 몇몇의 이미지는 아마 저작권이 있을지 모른다. 연구/비상업적 사용에 대한 카테고리 인식 모델 학습은 이 데이터에 대한 사용을 용인해주지만, 결과는 상업적 목적으로는 사용될 수 없다.

Clone this wiki locally