2015년 7월 20일 월요일

tiny cnn 설치

tiny cnnCaffeTheano에 비해 크기가 작은 cpp기반의 cnn library이다.
cuda-convnet이나 MatConvnet 등이 cpp library를 Matlab에서 호출하여 사용하는 것이 비해 tiny cnn은 c++전용(c++11) library이다.
설치 전에 먼저 https://github.com/nyanp/tiny-cnn 에 가서 설명을 읽어본다.
여기에 접속해서 mnist를 어떻게 학습하고 test하는지에 대한 문서를 읽어본다(꼭 읽어보기를 권한다).

tiny cnn을 실행하기 위해서는 tbb(Intel)와 boost라이브러리가 필요하다. tiny cnn은 용량을 작게 유지하기 위해 gpu(many core) 대신에 tbb(multi core)를 사용한다. 따라서 빠른 실행을 위해서는 tbb를 설치해야 한다.
아래에서 두 library를 설치하는 방법에 대한 것을 함께 설명한다.

tiny cnn 설치
(1) github에 가서 tiny-cnn을 다운 받는다.
(2) 압축을 풀어 install directory/vc로 들어가면 tiny_cnn.sln이라는 솔루션파일이 있다. visual studio 2012나 2013으로 이 파일을 열어 실행한다(여기서는 vs2013을 기준으로 설명).
(3) 컴파일 하면 error가 발생하는데 boost와 tbb가 설치되지 않아서이다.



boost설치
boost설치는 여기를 참고한다.  간단하게 요약해서 설명하면

(1) boost를 다운받고, 적당한 위치에 압축 해제 후에 cmd창 열어서 bootstrap.bat실행.
(2) 실행 후 b2.exe파일이 생기는데 이것을 이용하여 boost library를 빌드한다.
visual studio 2013에 대한 lib 빌드 명령은
b2 -j4 -a --toolset=msvc-12.0 variant=debug,release link=static threading=multi address-model=32 stage
이다.  vs버전이 달라지면 명령 중에 msvc-12.0를 수정해야 한다(예를 들면 vs2012는 msvc-11.0이다). 또 address-model=32는 visual studio의 Win32 compile 모드에 대응.

(3) 빌드가 끝나면 stage/libs 밑에 여러 lib파일이 생성된 것을 확인할 수 있다.

(4) 다시 vs2013으로 tiny cnn 솔루션을 열고(열면 두개의 project(tiny_cnn, tiny_cnn_test)가 있는데 여기서는 tiny_cnn프로젝트만 컴파일한다. 따라서 tiny_cnn_test프로젝트에서 나타나는 error는 무시하기 바란다), tiny_cnn 프로젝트에 대해 다음과 같이 설정해 보자.  tiny_cnn project의 속성을 열고

- C/C++ > General > Additional Include Directories 에 "installed location\boost_1_58_0" 추가
- Linker > General > Additional Library Directories 에 "installed location\boost_1_58_0\stage\lib" 추가

와 같이 경로를 설정한다.  다시 컴파일하면 boost에 대한 error는 없어지고 tbb가 설치되지 않았다는 error가 뜬다.



tbb설치
(1) 여기에서 tbb를 다운받는다.
(2) 적당한 위치에 압축 파일은 푼다.

(3) vs2013의 속성에 tbb의 include와 lib파일의 위치를 설정한다. tiny_cnn 프로젝트 속성에서
-VC++ directory > include directory에서  
install directory\tbb43_20150611oss_win\tbb43_20150611oss\include 경로 추가.
-Linker > General > Additional Library directories에 
install directory\tbb43_20150611oss_win\tbb43_20150611oss\lib\ia32\vc12 경로 추가
(단, vs2013은 vc12, vs2012는 vc11 등, vs버전에 따라 경로를 선택해 주어야 한다)

(4) tbb설치 directory의 bin/ia32/vc12에서 파일 tbb.dll(또는 tbb_debug.dll)을 복사하여 tiny cnn설치 위치의 vc/release(또는 vc/debug)밑에 복사한다.
또, tbb설치 directory의 lib/ia32/vc12에서 파일 tbb.lib(또는 tbb_debug.lib)을 복사하여 tiny cnn설치 위치의 vc/release(또는 vc/debug)밑에 복사한다.


위의 boost나 tbb설정은 visual studio의 두개의 컴파일 모드 release, debug에 대해 각기 해 주어야 한다.  먼저 release모드에 대해 설정하고 실행해 보기를 권한다.


설정이 완료 되었으므로 다시 컴파일하면 install directory/vc/release밑에 tiny_cnn.exe파일이 생성되며 이것을 실행하면 mnist 데이터에 대해 학습을 시작한다.
(Mnist는 학습시간이 꽤 걸림으로 빠른 실행을 위해 vs2013의 release모드에서 상기한 모든 과정을 수행할 것을 다시 한번 추천한다)

설정된 20번의 epoch 후에 최종 오차율은 98.7%에 도달 후에 종결한다. 이것은 cuda-convnet의 99.3%보다는 뒤진다.

오차율을 줄이기 위해 이런 방법이 있다.



MNIST 데이터 형식
example를 보면 mnist 데이터 형식은 idx1, idx3로 제공된다. 데이터 형식을 이해하기 위해 여기를 참고한다.
opencv 데이터 변환을 위해서는 여기 참고.




참고
[0] F:\download_2015\tiny-cnn-master\tiny-cnn-master