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


댓글 7개:

  1. 참 정리를 잘 하였습니다. 추가적으로, VS2012버전은 "프로젝트 속성창->구성속성->일반->플랫폼도구집합" 을 Visual Studio 2012 (v110)로 수정해야 합니다.

    답글삭제
    답글
    1. Training후에 테스트를 하려고 할 경우 "tiny_cnn_test.exe"파일을 클릭하면
      \tiny_cnn_test1 of 7 tests failed.
      [ FAILED ] read_write
      network : ..\test\test.cpp(566): (std::abs(res1[i] - res2[i]) < eps) == true fai
      led for: (std::abs(res1[i] - res2[i]) < eps) == false

      와 같은 에러가 나오는데, 테스트 파일idx을 불러서 테스트 하는것이 아니었는지, 어떤 부분의 설정을 바꾸어 주어야 하는지 궁금합니다. 감사합니다.

      삭제
    2. main.cpp 코드 내에 학습 data를 설정하는 부분이 있습니다. 데이터가 들어 있는 곳의 path를 정확하게 설정해 주어야 합니다. windows7(vs2013)에서는 경로를 "\\"를 사용해서 표시해야 합니다.

      삭제
    3. vs2012에 대한 설정에 대한 comment 감사드립니다.

      삭제
  2. compile중에 아래와 같은 에러가 뜨는데, 어떻게 해주어야 할까요?
    답변 부탁드립니다.
    Error 103 error C2872: 'float_t' : ambiguous symbol c:\2015\work\c code\tiny-cnn-master\test\test.cpp 559 1 tiny_cnn_test
    Error 104 error C2872: 'float_t' : ambiguous symbol c:\2015\work\c code\tiny-cnn-master\test\test.cpp 560 1 tiny_cnn_test
    106 IntelliSense: "float_t" is ambiguous c:\2015\Work\C Code\tiny-cnn-master\test\test.cpp 559 5 tiny_cnn_test
    107 IntelliSense: "float_t" is ambiguous c:\2015\Work\C Code\tiny-cnn-master\test\test.cpp 560 5 tiny_cnn_test
    108 IntelliSense: no instance of constructor "std::vector<_Ty, _Alloc>::vector [with _Ty=double, _Alloc=std::allocator]" matches the argument list
    argument types are: ( [4], *) c:\2015\Work\C Code\tiny-cnn-master\test\test.cpp 568 40 tiny_cnn_test

    답글삭제
  3. 도움 많이 되었습니다. 감사합니다.
    tbb의 4번글에 대해서 경험을 말씀드리면, 꼭 dll과 lib파일 복사 안하고 컴파일러 내 환경변수(구성속성-디버깅-환경 편집)와 읽을 라이브러리 파일을 지정(구성속성-링커-입력-추가종속성 편집)해주어도 되는것같습니다!

    답글삭제