Caffe+VS+CUDA75+Matlab配置流程Word文档格式.docx
《Caffe+VS+CUDA75+Matlab配置流程Word文档格式.docx》由会员分享,可在线阅读,更多相关《Caffe+VS+CUDA75+Matlab配置流程Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
7.4打开gflags.sln,右键生成32位/64位的Debug/Release库
8Glog配置
下载Glog库,解压。
打开根目录下google-glog.sln,右键生成32位/64位的Debug/Release库
9LevelDB配置
9.1下载LevelDB库,解压。
9.2点Configure,选择“Visual
9.3设置Boost路径
Boost_INCLUDE_DIR:
D:
\boost_1_59_0
9.3点Configure后,点Generate,生成leveldb.sln
9.4打开leveldb.sln,右键生成32位/64位的Debug/Release库
注:
第1次生成后,会有几项失败的,再右键生成1次便可。
10LMDB配置
10.1下载LMDB库,解压。
10.2打开VisualStudio,文件->
新建->
从现有代码创建项目
10.3选上源代码文件夹,并命名项目
10.4下一步,项目类型:
控制台应用程序项目
10.5完成后,设置:
项目属性->
配置属性->
配置类型:
静态库(.lib)
10.6添加unistd.h、getopt.h、getopt.c到工和源文件里
unistd.h下载地址:
getopt.h、getopt.c下载地址:
http:
//ieng6.ucsd.edu/~cs12x/vc08install/getopt9.zip
10.7把包含#include<
unistd.h>
改为#include"
unistd.h"
,接着,右键生成32位/64位的Debug/Release库
11ProtoBuf配置
下载ProtoBuf库,解压。
打开根目录/vsprojects/protobuf.sln,分别右键libprotobuf、libprotoc、protoc生成32位/64位的Debug/Release库
12HDF5安装
下载HDF5安装包hdf5-1.8.16-win64-vs2013-shared.zip,装完后:
***************************************
经过上面的准备,下面开始配置caffe
1下载Berkeley官方caffe库,解压出一个caffe-master文件夹(即根目录)。
2其他辅助工具:
链接:
密码:
v0gq
3准备第3方库,在caffe根目录下建3rdparty文件夹,再建如下子文件夹:
把前面生成的dll库、lib库、.h头文件,放在对应的文件夹里。
bin、include、lib里的文件如下图,3rdparty.7z下载地址:
4h9p
4打开VisualStudio,在根目录下新建一个项目名为caffe的空项目,并设置为x64Release平台,下面只讲解此平台的配置,Debug平台与此类似。
4.1右键项目名->
生成依赖项->
生成自定义:
勾选CUDA7.5
4.2在编译protobuf时已生成protoc.exe,把它拷到\src\caffe\proto目录下,打开cmd,到该目录下输入:
protoccaffe.proto--cpp_out=./将生成caffe.pb.cc和caffe.pb.h文件。
4.3把与\src\caffe对应的所有文件及文件夹添加进工程里(test文件夹可以不加)
4.4配置相关路径及选项,以下绝对路径需要根据实际作修改,打开项目属性:
常规->
输出目录:
..\bin
VC++目录->
包含目录:
..\..\src
..\..\include
..\..\3rdparty\include
..\..\3rdparty\include\hdf5
..\..\3rdparty\include\lmdb
..\..\3rdparty\include\openblas
\opencv2.4.10\build\include
\opencv2.4.10\build\include\opencv
\opencv2.4.10\build\include\opencv2
C:
\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v7.5\include
库目录:
..\..\3rdparty\lib
\boost_1_59_0\stage\lib
\opencv2.4.10\build\x64\vc12\lib
\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v7.5\lib\x64
链接器->
输入->
附加依赖项:
cuda.lib
cudnn.lib
cudart.lib
curand.lib
gflags.lib
cublas.lib
libglog.lib
libprotoc.lib
libprotobuf.lib
libopenblas.dll.a
lmdb.lib
leveldb.lib
shlwapi.lib
szip.lib
zlib.lib
libhdf5.lib
libhdf5_hl.lib
opencv_core2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
C/C++->
预处理器->
预处理器定义:
USE_LMDB
USE_OPENCV
USE_LEVELDB
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
CUDAC/C++->
Common->
TargetMachinePlatform:
64-bit
Device->
CodeGeneration:
compute_20,sm_20
compute_30,sm_30
compute_35,sm_35
compute_50,sm_50
4.5下面开始逐步编译并修改bug
(1)编译common.cpp,右键选择编译。
从输出错误列表中定位相应的错误:
添加:
#include<
process.h>
修改:
getpid()->
_getpid()
以上编译成功后才接着下面的编译
(2)编译solver.cpp
snprintf()->
sprintf_s()
(3)编译caffe.cpp,从根目录\tools文件夹里,把caffe.cpp添加进工程源文件中。
4.6上面几个文件编译成功后,开始生成整个项目:
生成结束后会出现大量错误,需要反复生成多次才能找出所有的错误,下面逐一修复:
(1)在cudnn.hpp文件中的cudnnGetErrorString函数名前添加:
CUDNNWINAPI
(2)在signal_handler.cpp文件中,修改:
constfloatkBNLL_THRESHOLD=50.->
#definekBNLL_THRESHOLD50.0
(3)在bnll_layer.cu文件中,添加:
#defineSIGHUP1
#defineSA_RESTART0x0002
#definesigfillset(set)(*(set)=~(sigset_t)0,0)
typedefunsignedintsigset_t;
structsigaction{
void(*sa_handler)(int);
sigset_tsa_mask;
intsa_flags;
};
并注释这些出错语句:
if(sigaction(SIGHUP,&
sa,NULL)==-1){
LOG(FATAL)<
<
"
CannotinstallSIGHUPhandler."
;
}
if(sigaction(SIGINT,&
CannotinstallSIGINThandler."
(4)在hdf5.cpp文件中,修改:
给switch(class_)中的每个case分支加上花括号
(5)在db_lmdb.cpp文件中,添加:
#include<
direct.h>
并把mkdir()改为_mkdir(),且将第2个参数去除
(6)在contrastive_loss_layer.cpp文件中,修改为:
(7)在math_functions.cpp文件中,添加:
#define__builtin_popcount__popcnt
#define__builtin_popcountl__popcnt
(8)在io.cpp文件中,添加:
io.h>
并修改函数名:
open()->
_open();
close()->
_close()
(9)在common.cpp文件中,添加:
boost/date_time.hpp>
voidinitGlog(){
FLAGS_log_dir="
.\\log\\"
_mkdir(FLAGS_log_dir.c_str());
std:
:
stringLOG_INFO_FILE;
stringLOG_WARNING_FILE;
stringLOG_ERROR_FILE;
stringLOG_FATAL_FILE;
stringnow_time=boost:
posix_time:
to_iso_extended_string(boost:
second_clock:
local_time());
now_time[13]='
-'
now_time[16]='
LOG_INFO_FILE=FLAGS_log_dir+"
INFO"
+now_time+"
.txt"
google:
SetLogDestination(google:
GLOG_INFO,LOG_INFO_FILE.c_str());
LOG_WARNING_FILE=FLAGS_log_dir+"
WARNING"
GLOG_WARNING,LOG_WARNING_FILE.c_str());
LOG_ERROR_FILE=FLAGS_log_dir+"
ERROR"
GLOG_ERROR,LOG_ERROR_FILE.c_str());
LOG_FATAL_FILE=FLAGS_log_dir+"
FATAL"
GLOG_FATAL,LOG_FATAL_FILE.c_str());
并修改GlobalInit()函数:
voidGlobalInit(int*pargc,char***pargv){
//Googleflags.
gflags:
ParseCommandLineFlags(pargc,pargv,true);
initGlog();
google:
InitGoogleLogging(*(pargv)[0]);
(10)在base_data_layer.cpp文件中,初始化:
cudaStream_tstream=nullptr;
在base_data_layer.cpp文件中,初始化:
以上不一定能修复所有代码bug,如还未生成成功,请自行修复。
5上面生成成功后会在根目录\caffe\bin下生成一个caffe.exe,重命名为caffe_gpu.exe,防止被覆盖,后面将会用到。
经过上面过程,caffe已经编译完成,下面开始测试mnist库
1下载辅助工具
1.1把wget库解压,并添加环境变量:
Path=D:
\wget-1.11.4b
1.2把7za.exe、wget.exe、libiconv2.dll、libintl3.dll、libssl32.dll放进\3rdparty\bin
把get_mnist.bat放进\data\mnist
把create_mnist.bat、train_lenet.bat放进\examples\mnist
1.3双击运行\data\mnist\get_mnist.bat,将自动下载并解压mnist数据库。
或者下载已经解压好的数据库放在此路径下:
bbsb
或者到官方网站下载,解压并命名为对应的名字即可:
2添加环境变量,把\3rdparty\bin添加到环境变量中
Path=E:
\caffe3\caffe-master\3rdparty\bin
2.1把工程源文件中的caffe.cpp移除,将
\examples\mnist\convert_mnist_data.cpp添加到项目的源文件中,生成项目。
运行完后convert_mnist_data.cpp有错,需要修复:
,并把mkdir()作如下修改:
分别对mdb_env、mdb_txn、db初始化:
2.2生成成功后,把\caffe\bin\caffe.exe重命名为convert_mnist_data.exe。
2.3下载辅助dll库:
zigr
把刚下载和之前生成的dll库放进\3rdparty\bin,有:
libquadmath-0.dll
libgcc_s_seh-1.dll
libgcc_s_sjlj-1.dll
libgfortran-3.dll
libglog.dll
libopenblas.dll
cudnn64_70.dll
2.4在\examples\mnist\下新建mnist_test_leveldb和mnist_train_leveldb两个文件夹,双击运行create_mnist.bat,生成leveldb数据格式。
或者下载已经转换好的数据放在此路径下:
jdks
3下面开始训练和测试
3.1打开lenet_train_test.prototxt文件,把里面所有的lmdb替换成leveldb。
3.2把\caffe\bin\caffe_gpu.exe重命名为caffe.cpp,再双击运行\examples\mnist\train_lenet.bat,开始训练和测试,运行结果:
以上结果是在teslak20cGPU上的测试结果,测试10000个样本大约需要165ms,准确率为:
99.01%(每次测试的结果会有点波动)。
上面程序通过修改\examples\mnist\lenet_solver.prototxt文件中的属性,可以设定不同的测试条件。
下面开始配置NVidia提供的开源库cuDNN,该库专用于深度学习框架,以提高训练效率。
1在上面工程的基础上,把convert_mnist_data.cpp移除,将根目录\tools\caffe.cpp重新添加到工程源文件中。
预处理器定义,添加:
USE_CUDNN
2把cuDNN库中的cudnn64_70.dll、cudnn.h、cudnn.lib分别拷到\3rdparty\的bin、include、lib文件夹里。
接着,右键生成项目。
3项目生成成功后,把\caffe\bin\caffe.exe备份,命名为:
caffe_cudnn.exe,以防止被覆盖(用到时把名字改回caffe.exe即可)。
4双击运行\examples\mnist\train_lenet.bat,开始训练和测试,运行结果:
以上结果是在teslak20cGPU上,使用cuDNNv3库的测试结果,测试10000个样本大约需要168ms,准确率为:
99.11%(每次测试的结果会有点波动)。
以上是在VisualStudio平台下测试的,下面开始配置MatlabR2014a。
1下载修复后的caffe_.cpp文件:
rob6
把刚下载的caffe_.cpp和matcaffe.def拷到\matlab\+caffe\private,并覆盖原有的文件。
2在上面工程的基础上,把caffe.cpp移除,将根目录\matlab\+caffe\private\caffe_.cpp添加到工程源文件中。
3配置属性,打开项目属性:
..\..\matlab\+caffe\private
目标文件名:
caffe_
目标文件扩展名:
.mexw64
\ProgramFiles\MATLAB\R2014a\extern\include
\ProgramFiles\MATLAB\R2014a\extern\include\win64
\ProgramFiles\MATLAB\R2014a\extern\lib\win64\microsoft
libmx.lib
libmex.lib
libmat.lib
模块定义文件:
../../matlab/+caffe/private/matcaffe.def
4右键生成项目,将会生成\matlab\+caffe\private\caffe_.mexw64,这是matlab的库文件。
5测试
5.1把前面下载到的bvlc_reference_caffenet.caffemodel放进\models\bvlc_reference_caffenet
5.2打开Matlab,把路径改为caffe根目录,输入:
addpath./matlab
5.3把路径改为\matlab\demo,classification_demo是一个分类函数,模型已经训练好即bvlc_reference_caffenet.caffemodel,这是1000分类的模型,调用格式:
其中,s是各类的分数,l是该图像的预测标签。
具体分类:
//www.image-net.org/challenges/LSVRC/2012/
参考网址:
//caffe.berkeleyvision.org/