Caffe Example : 3.Alex’s CIFAR 10 tutorial, Caffe style (Kor) - ys7yoo/BrainCaffe GitHub Wiki

알렉스의 CIFAR-10 입문서, Caffe 방식(Alex’s CIFAR-10 tutorial, Caffe style)

알렉스 크리쳅스키의 cuda-convnet는 모델정의, 파라미터들, CIFAR-10에 기반한 좋은 수행을 위한 훈련과정을 상세히 묘사하였다. 이 예시는 Caffe에서 그의 결과를 다시한번 해본다.

우리는 당신이 Caffe를 성공적으로 컴파일하였다고 가정할 것이다. 아니라면, 설치페이지를 참고하기를 바한다. 이 튜토리얼에서 우리는 당신의 카페 설치가 CAFFE_ROOT에 위해 있다고 가정할 것이다.

우리는 모델 개요와 해결사 구성을 정의하는 PR(pull request)를 받아준 @chyojn에게 감사한다.

이 예시는 현재 작업중이다. 네트워크와 훈련선택 그리고 전체 훈련 기준에 대한 자세한 사항을 더욱 설명하는데 좋을 것이다.

데이터세트 준비(Prepare the Dataset)

처음에 CIFAR-10 웹사이트로부터 다운로드하고 데이터 형태를 전환할 필요가 있다. 이를 위해, 간단히 다음의 명령어를 실행할 수 있다:

cd $CAFFE_ROOT
./data/cifar10/get_cifar10.sh
./examples/cifar10/create_cifar10.sh

만약 wget이나 gunzip이 설치되지 않는다고 하면, 우선 이들을 설치해야할 필요가 있다. 위 명령어를 실행후에는 ./cifar10-leveldb에 데이터세트가 있을것이고 데이터 세트 이미지 평균은 ./mean.binaryproto에 있을것이다.

모델(The Model)

CIFAR-10 모델은 컨볼루션, 풀링, rectified linear unit (ReLU) nonlinearities,그리고 전체 최상위에서 선형 분류화로하는 지역 상수 표준화의 계층을 구성하는 CNN이다. 우리는 CAFFE_ROOT/examples/cifar10 디렉토리의 cifar10_quick_train_test.prototxt에서 모델을 정의해왔다.

"빠른" 모델 훈련과 실험(Training and Testing the “Quick” Model)

모델을 학습하는것은 당신이 네트워크 정의 protobuf와 해결사 protobuf 파일들 작성한 후라면 간단하다.(MNIST Tutorial을 참고하라) 간단히 train_quick.sh을 실행하거나, 다음의 명령어를 직접적으로 실행하라.

cd $CAFFE_ROOT
./examples/cifar10/train_quick.sh

train_quick.sh은 간단한 스크립트라 한번 안을 보아라. 학습에있어 메인 도구는 학습행동으로하는 caffe이, 해당 파일의 언급에 따라 해결사 protobuf 텍스트 파일이다.

이 코드를 실행할 때, 다음과 같이 수많을 메세지들이 날라다니는 것을 볼 수 있다:

I0317 21:52:48.945710 2008298256 net.cpp:74] Creating Layer conv1
I0317 21:52:48.945716 2008298256 net.cpp:84] conv1 <- data
I0317 21:52:48.945725 2008298256 net.cpp:110] conv1 -> conv1
I0317 21:52:49.298691 2008298256 net.cpp:125] Top shape: 100 32 32 32 (3276800)
I0317 21:52:49.298719 2008298256 net.cpp:151] conv1 needs backward computation.

이메세지들은 각각의 계층에 대한 세부사항, 이에 해당하는 연결과 출력 형태를 당시에게 알려주며, 이는 아마 디버깅에 있어 도움이 될 것이다. 초기화 후에는, 학습이 시작될 것이다:

I0317 21:52:49.309370 2008298256 net.cpp:166] Network initialization done.
I0317 21:52:49.309376 2008298256 net.cpp:167] Memory required for Data 23790808
I0317 21:52:49.309422 2008298256 solver.cpp:36] Solver scaffolding done.
I0317 21:52:49.309447 2008298256 solver.cpp:47] Solving CIFAR10_quick_train

해결사 설정사항에 기반하여, 우리는 매 100회 반복마다 손실 함수를 훈련시키는 것을 출력할 것이며, 매 500회 반복마다 네트워크를 실험할 것이다. 당신은 다음과 같은 메세지를 볼 수 있다:

I0317 21:53:12.179772 2008298256 solver.cpp:208] Iteration 100, lr = 0.001
I0317 21:53:12.185698 2008298256 solver.cpp:65] Iteration 100, loss = 1.73643
...
I0317 21:54:41.150030 2008298256 solver.cpp:87] Iteration 500, Testing net
I0317 21:54:47.129461 2008298256 solver.cpp:114] Test score #0: 0.5504
I0317 21:54:47.129500 2008298256 solver.cpp:114] Test score #1: 1.27805

각각 훈련 반복에대하여, lr은 해당 반복에 대한 학습율이며, 손실은 학습 함수이다. 실험 단계에서의 출력에 대해서는, 스코어 0은 정확도, 스코어 1은 실험한 손실 함수이다.

그리고 당신 스스로 커피 한 컵을 만들고 나면(당신만의 Caffe 모델을 만들고 나면), 당신은 끝난 것이다!

I0317 22:12:19.666914 2008298256 solver.cpp:87] Iteration 5000, Testing net
I0317 22:12:25.580330 2008298256 solver.cpp:114] Test score #0: 0.7533
I0317 22:12:25.580379 2008298256 solver.cpp:114] Test score #1: 0.739837
I0317 22:12:25.587262 2008298256 solver.cpp:130] Snapshotting to cifar10_quick_iter_5000
I0317 22:12:25.590215 2008298256 solver.cpp:137] Snapshotting solver state to cifar10_quick_iter_5000.solverstate
I0317 22:12:25.592813 2008298256 solver.cpp:81] Optimization Done.

우리의 모델은 75% 이상의 실험 정확도을 달성했다. 이 모델의 파라미터들은 cifar10_quick_iter_5000내의 이진수의 protobuf 형태로 저장된다.

이는 CPU나 GPU 모드에서 배치될 준비가 되있다. 새로운 데이터를 요구할 수 있는 배치 모델 정의에 대한 CAFFE_ROOT/examples/cifar10/cifar10_quick.prototxt를 참고할 수 있다.

왜 GPU상에서 학습하는가?(Why train on a GPU?)

여전히 적지만, CIFAR-10는 GPU 학습에 매력적이도록 만들만한 출분한 데이터를 지니고있다.

CPU와 GPU 학습 속도를 비교하기위해, 모든 cifar*solver.prototxt속 한 라인을 간단히 바꿀 수 있다.

# 해결사 모드: CPU or GPU
solver_mode: CPU

그리고 당신은 CPU 훈련을 사용할 것이다.

위키로 돌아가기