Skip to content

Caffe Example : 1.Brewing ImageNet (Kor)

HanJiHoon edited this page Jan 3, 2017 · 5 revisions

이미지망 집중학습(Brewing ImageNet)

이 가이드는 당신이 소유한 데이터에 대한 당신만의 모델을 학습할 준비가 되었다는하에 진행한다. 만약 이미지망으로 학습된 네트워크(ImageNet-trained network)를 원한다면, 학습이 많은 에너지를 취하는데 우리는 지구온난화를 싫어하기때문에, 우리는 CaffeNet 모델을 model zoo에서 아래와같이 서술된것으로써 학습시켰다.

데이터준비(Data Preparation)

이 가이드는 모든 과정을 명시하고 모든 명령어가 Caffe root directory에서 실행된다는 가정한다. “ImageNet”에의해 우리가 여기 ILSVRC12 challenge를 말하지만, 약간의 디스크 공간과, 더 적은 학습시간으로 당신은 쉽게 ImageNet의 전체 또한 학습시킬수 있다.

우리는 당신이 이미지망 학습데이터와 유효데이터를 다운로드 해놓았다고 가정하며, 이들은 당신의 디스크상에 다음과 같이 저장된다:

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG

우선 학습을 위해 몇개의 예비 데이터를 준비해놓을 필요가 있다. 이 데이터는 다음에 의해 다운로드할 수 있다.

./data/ilsvrc12/get_ilsvrc_aux.sh

학습입력과 유효입력은 모든 파일들과 그들의 라벨들을 리스트한 글로적힌 train.txt와 val.txt에 적혀있다. 우리는 ILSVRC devkit와는 달리 라벨에대해 인덱스를 매겨놓는 색다른 방법을 사용할 것임을 알아두어라. 우리는 synset이름들을 그들의 아스키법칙에 따라 분류하고, 그러고나서 그들을 0부터 999까지 라벨을 붙인다. synset/name 맵핑에 대하여는 synset_words.txt을 보라.

당신은 아마 미리 256x256로 이미지의 크기를 재설정하길 원할것이다. 디폴트값에의해, 우리는 딱히 이를 할 필요가 없는데, 이는 군집화 환경에서, mapreduce를 사용해서 병렬 방식에서 재설정하는 이미지로부터 이득을 취할수 있을지 모르기 때문이다. 예들들어 Yangqing은 그의 경량의 mincepie 패키지를 사용했다. 만약 더 간단하게 하는 것을 선호한다면, 당신은 또한 다음과 같은 shell 명령어를 사용할 수 있다.

for name in /path/to/imagenet/val/*.JPEG; do
    convert -resize 256x256\! $name $name
done

examples/imagenet/create_imagenet.sh을 한번보라. 필요하다면 학습디렉토리와 유효디렉토리 경로를 지정하고, 미리 이미지의 크기를 수정해두지 않았다면, 256x256로 모든 이미지의 크기를 재설정하기위해 “RESIZE=true”를 설정하라. 지금, examples/imagenet/create_imagenet.sh로 leveldbs를 간단히 만들어보아라 examples/imagenet/ilsvrc12_train_leveldb와 examples/imagenet/ilsvrc12_val_leveldb는 이번 실행전에 존재하지 않았을 것임을 알고있으라. 이 명령구문으로 생성될 것이다. GLOG_logtostderr=1은 점검하기위해 당신을 위해 더 많은 정보를 버릴것이고, 당신은 안전하게 이를 무시할 수 있다.

이미지 평균 연산하기(Compute Image Mean)

모델은 당신에게 각각 이미지로부터 이미지 평균을 빼라고 요구할 것이고, 그래서 우리는 이 평균을 계산해야만한다. tools/compute_image_mean.cpp가 이를 수행한다. 이는 또한 어떻게 다중요소들 예를들면 프로토콜 버퍼(protocol buffer)나 leveldbs, 그리고 로깅(logging)와 같은 것들을 다루는 방법과 당신자신을 친숙하게 해줄 좋은 예이다. 어쨌거나, 평균연산은 다음과 같이 수행되어질 수있다:

./examples/imagenet/make_imagenet_mean.sh

이는 data/ilsvrc12/imagenet_mean.binaryproto를 만들어낼것이다.

모델정의(Model definition)

우리는 Krizhevsky, Sutskever, 그리고 Hinton가 처음 NIPS 2012 paper에 제시한 접근방법에 대하여 참조구현을 설명할 것이다.

네트워크 정의(models/bvlc_reference_caffenet/train_val.prototxt)는 in Krizhevsky 와 그의 동료들의 것을 따른다. 만약 당신이 이 가이드에서 제시한 파일 경로로부터 벗어난다면, 당신은 .prototxt 파일들에서 적절한 경로를 조절할 필요가 있음을 유의하라.

만약 당신이 유심히 models/bvlc_reference_caffenet/train_val.prototxt를 보았다면, phase: TRAIN이나 혹은 phase: TEST 둘 중 하나를 명시한 include 세션들 볼 것이다. 이러한 세션들은 한 파일에서 우리에게 둘이 가깝게 연관된 네트워크들(학습용으로 사용되는 네트워크와 실험용으로 사용되는 네트워크)을 정의할 수 있게 해준다. 이러한 두 네트워크들은 include { phase: TRAIN }이나 include { phase: TEST }로 적힌 것들을 제외하고 모든 계층들을 공유하여 거의 동일하다. 이러한 경우에서, 단일 입력 계층과 하나의 출력 계층은 다르다.

  • 입력계층 차이점(Input layer differences)

학습 네트워크의 데이터 입력 계층은 examples/imagenet/ilsvrc12_train_leveldb로부터 해당하는 데이터를 서술하며 랜덤으로 입력이미지를 미러링한다. 실험 네트워크의 데이터 계층은 examples/imagenet/ilsvrc12_val_leveldb에서 데이터를 취하지만 랜덤 미러링은 수행하지 않는다.

  • 출력계층 차이점(Output layer differences)

두 네트워크 모두 softmax_loss 계층을 출력하며, 이는 학습에서 손실 함수를 연산하고 backpropagation을 초기화하는데 사용되며, 반면에 유효에서는 이 손실은 간단히 보고만 한다. 실험 네트워크는 또한 두번째 출력 계층, 정확도를 지니고 있고, 이는 실험 세트에 대한 정확도를 보고하는데만 사용된다. 학습과정에서, 실험 네트워크는 때때로 예를들며 설명할 것이고 Test score #0: xxx 이나 Test score #1: xxx와 같은 줄을 생성하면서 실험 세트에 대하여 실험될 것이다. 이러한 경우, 스코어 0은 정확도이며(이 정확도는 학습되지 않은 네트워크에 대하여 1/1000 = 0.001 주변에서 시작한다), 그리고 스코어 1은 손실이다(이 손실은 학습되지않은 네트워크에 대하여 약 7 주변에서 시작할 것이다.).

우리는 또한 해결사를 실행하기 위한 프로토콜 버터를 구현할 것이다. 계획을 세워보자:

  • 우리는 256의 일회처리량으로 실행할 것이고, 전체 450,000만번의 반복 (약 90회의 에코)을 실행할 것이다.
  • 매 1000번 반복마다 우리는 유효 데이터에 대하여 학습된 망을 실험한다.
  • 우리는 초기 학습율을 0.01로 설정하고, 이를 매 100,000만번 (약 20회의 에코)에서 감소할 것이다.
  • 정보들은 매 20회 반복마다 보여질 것이다.
  • 네트워크는 모멘텀 0.9 그리고 0.0005의 가중치 감소로 학습될 것이다.
  • 매 10,000번 반복마다, 우리는 현재 상태의 스냅샷을 찍을 것이다.

괜찮아 보이지? 이는 models/bvlc_reference_caffenet/solver.prototxt.에 구현되어있다.

이미지망 학습하기(Training ImageNet)

준비됬지? 시작해보자.

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

이제 즐겨보라고!

K40 머신상에서는, 매 20회 반복마다 (K20머신상에서는 36초가 걸리는데 비해) 실행하는데 약 26.5초가 걸리며, 매우 효과적으로 정방향-역방향 과정 모두에 대하여 이미지당 약 5.2 ms가 걸린다. 약 2 ms가 정방향에 사용되고, 나머지는 역방향에서 사용된다. 만약 이 연산시간을 해부하는데 흥미가있다면, 다음을 실행시켜볼 수 있다.

./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt

학습재개?(Resume Training?)

우리는 모두 파워가 나갈때를 경험해봤거나 배틀필드를 즐김으로써 거의 우리자신을 가치있게 보람있지않은 것 같이 느꼈다(누구 퀘이크를 아직도 기억하는 이가 있는가?). 우리가 학습중에 중간 결과를 스냅샷으로 찍기 때문에, 우리는 스냅샷에서 부터 재개할 수 있다. 이는 다음과 같이 간단히 수행될 수 있다.

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate

스크립트에서 caffenet_train_iter_10000.solverstate는 정확한 해결사 상태를 복구하는 모든 필수적인 정보를 저장하는 해결사 상태 스냅샷이다.

작별인사(Parting Words)

당신이 이 레시피를 좋아하기를 희망한다! 네트워크의 구조를 바꾸면서 그리고/혹은 새로운 데이터와 업무를 보내려는 네트워크내의 다양한 파라미터들을 잘 조율하면서, ILSVRC 2012 challenge이래로 많은 연구자들은 더욱 진전했다. 간단히 적은 다양한 prototxt 파일들에의해 Caffe가 당신을 다양한 네트워크 선택을 좀 더 쉽게 탐색하도록 하여라. - 흥미롭지 않아?

그리고 당신이 네트워크를 막 훈련시켰기 때문에, classifying ImageNet에 대한 Python 인터페이스로는 어떻게 사용하는지 확인해보라

Clone this wiki locally