说明:本文安装caffe前,已经安装好了python的各种常用包,CUDA9.0,cudNN7.5,opencv3.4.0
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential cmake git pkg-config
sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install -y libatlas-base-dev
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install -y python-pip
sudo apt-get install -y python-dev
sudo apt-get install -y python-numpy python-scipy
sudo apt-get install -y libopencv-dev
git clone https://github.com/BVLC/caffe.git //从github上下载 caffe
cd caffe
cp Makefile.config.example Makefile.config //将Makefile.config.example的内容复制到Makefile.config
//因为make指令只能make Makefile.config文件,而Makefile.config.example是caffe给出的makefile例子
gedit Makefile.config //打开Makefile.config文件
//如果你不使用GPU的话,就将
# CPU_ONLY := 1
修改成:
CPU_ONLY := 1 显然我这里是要使用GPU的,所以这里不用修改
//使用cudnn加速,需要将
# USE_CUDNN := 1
修改成:
USE_CUDNN := 1
//若使用的opencv版本是3的,则将
# OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
//这里我刚开始就没有修改,导致最后编译出错
# USE_LEVELDB := 0
# USE_LMDB := 0
//修改成:
USE_LEVELDB :=1
USE_LMDB :=1
//若要使用python来编写layer,则需要将
# WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
将# Whatever else you find you need goes here.下面的
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
//这是因为ubuntu16.04的文件包含位置发生了变化,尤其是需要用到的hdf5的位置,所以需要更改这一路径
//打开makefile文件,按ctrl+F,搜索并替换
//将下面该语句
NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
//替换为
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
//保存并退出
//在caffe目录下cd到caffe下的python目录
cd python
for req in $(cat requirements.txt); do pip install $req; done
\\如果发现执行上述代码后,终端中有很多红字,一堆的错误之类的,那不管是什么错误都执行下面一句话:
for req in $(cat requirements.txt); do sudo -H pip install $req --upgrade; done
\\执行完上面这句话后应该就不会有很多红字错误了
cd ..\\回到caffe文件夹的位置
make all -j12 //j12代表计算机cpu有12个核,这个得根据自己的电脑配置,我这里可以12线程一起make,这样make速度会快上很多
make test -j12
sudo make runtest -j12
//这里直接 make runtest -j12 可能如下报错
check failed : status == cublas_status_success(1 vs 0) cublas_status_not_initialized
make pycaffe //如果以后用python来开发的话必须执行这一句,一般不管你是否用python,都会执行这一句
make distribute
到这里,安装caffe基本上就差不多完成了。如下图所示:
但是笔者在安装过程中,遇到了各种各样的问题,百度google了很多,也参见了网上很多博客大牛的博文,后面将罗列出一些安装caffe所遇到的坑。
1.make all -j12 出现错误:.build_release/tools/caffe: error while loading shared libraries: libcudart.libcudart.so.9.0 cannot open shared objuect filee : No such file or directory
主要是我这里的CUDA安装的是9.0版本,所以会出现这种错误,那么此时可以执行一下代码:
sudo cp /usr/local/cuda-9.0/lib64/libcudart.so.9.0 /usr/local/lib/libcudart.so.9.0 && sudo ldconfig
sudo cp /usr/local/cuda-9.0/lib64/libcublas.so.9.0 /usr/local/lib/libcublas.so.9.0 && sudo ldconfig
sudo cp /usr/local/cuda-9.0/lib64/libcurand.so.9.0 /usr/local/lib/libcurand.so.9.0 && sudo ldconfig
2、类似以下情况的错误:
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector >&, std::vector > const&)'
这种问题很有可能是你的系统中使用的是opencv3,但是你的Makefile.config中没有将OPENCV_VERSION := 3这一句取消注释。
3、编译caffe出现以下错误:
nvcc fatal : Unsupported gpu architecture 'compute_20'
解决办法:
在Makefile.config文件中
CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \
#-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
因为我装的是CUDA9.0所以把下面这两行删除就可以了
-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
然后重新make clean,再make all -j12
4、make all -j12出现如下错误:m//home/njust/anaconda3/lib/libpng16.so.16:对‘inflateValidate@ZLIB_1.2.9’未定义的引用
解决办法:在Makefile.config中,加入下面一句:
LINKFLAGS := -Wl,-rpath,$(HOME)/anaconda3/lib
1.下载mnist数据集,终端输入
cd /home/yourname/caffe/data/mnist/
./get_mnist.sh 获取mnist数据集
之后在/home/yourname/caffe/data/mnist/目录下会多出训练集图片、训练集标签、测试集图片和测试集标签等4个文件
2.mnist数据格式转换,终端输入
cd /home/yourname/caffe/
./examples/mnist/create_mnist.sh
//这里必须在第一行后运行第二行(针对我的指令),即必须在根目录下运行create_mnist.sh,
此时在/caffe/example/mnist/目录下会生成mnist_test_lmdb和mnist_train_lmdb的lmdb格式的训练集和测试集
//我在运行时,报了如下错误,如图所示:
经过Google,在github有人给出了自己的解决方法,
(caffe_root)
cd build
cmake ..
make
//编译好后
cd ..
./examples/mnist/create_mnist.sh
3.然而在make的时候我又遇到了一个问题,一脸懵逼:
/usr/local/lib/libopencv_imgcodecs.so.3.4.0: undefined reference to TIFFReadDirectory@LIBTIFF_4.0' /usr/local/lib/libopencv_imgcodecs.so.3.1.0: undefined reference toTIFFWriteEncodedStrip@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.4.0: undefined reference to TIFFIsTiled@LIBTIFF_4.0' /usr/local/lib/libopencv_imgcodecs.so.3.1.0: undefined reference toTIFFOpen@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.4.0: undefined reference to TIFFReadEncodedStrip@LIBTIFF_4.0' /usr/local/lib/libopencv_imgcodecs.so.3.1.0: undefined reference toTIFFSetField@LIBTIFF_4.0'
/usr/local/lib/libopencv_imgcodecs.so.3.4.0: undefined reference to TIFFWriteScanline@LIBTIFF_4.0' /usr/local/lib/libopencv_imgcodecs.so.3.1.0: undefined reference toTIFFGetField@LIBTIFF_4.0'
此时这里就要回到以前安装opencv3.4.0时落下的一个坑,上面提示TIFF未引用,这里要重新回到编译opencv3.4.0那里去,
cd opencv3.4.0
cd 到build文件夹,在里面可以看到CMakeCache.txt,里面发现WITH_TIFF=ON,BUILD_TIFF=OFF
//所以你得重新cmake你的opencv3.4.0,在cmake时加入-D BUILD_TIFF=ON,原cmake语句:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
加入后的语句为:
cmake -D BUILD_TIFF=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
//注意:这里一定不要在末尾加入,笔者之前就是在末尾加的,一直报错,弄了好久才发现不可以在末尾添加
cmake后,就要开始进行编译了,这里也有一个比较坑的地方,还是在build文件夹下
//终端输入
sudo make -j12
//如果你会发现程序一直卡在一个点上,此时你得终止编译
ctrl + Z,
然后转而使用
sudo make //进行编译
上面结束之后,你再尝试如下代码,就可以编译通过了,可以产生两个lmdb文件夹了,如果发现不行,建议你从开始安装caffe,走一遍流程就行了
(caffe_root)
cd build
cmake ..
make
//编译好后
cd ..
./examples/mnist/create_mnist.sh
成功的图如下所示:
4.这里我们采用LeNet-5模型来训练手写数字体,
LeNet-5模型描述在/caffe/examples/mnist/lenet_train_test.prototxt
Solver配置文件在/caffe/examples/mnist/lenet_solver.prototxt
5.训练mnist,执行文件在/caffe/examples/mnist/train_lenet.sh
终端输入
cd /home/yourname/caffe/
./examples/mnist/train_lenet.sh
这里呢,可能又有一个坑:
这个错误和前面的一个错误很像,只要在运行程序前加一个 sudo就行了
sudo ./examples/mnist/train_lenet.sh
最后,测试结果如下:我的GTX1080ti迭代10000次,总共花费了12秒就训练好了,测试结果accuracy=0.9906
参考博文:
https://blog.csdn.net/wopawn/article/details/52302164
https://blog.csdn.net/autocyz/article/details/51783857
https://blog.csdn.net/ruotianxia/article/details/78437464
https://blog.csdn.net/gpwner/article/details/79179259