Ubuntu16.04下配置caffe(仅CPU)

 参考:http://blog.csdn.net/zt_1995/article/details/56283249
 

第二次配置caffe环境,依旧把之前犯过的错误重新走了一遍,不会配置的地方还是忘了,所以打算通过博客记录下来,方便以后学习使用。

1.安装依赖包

  1. $ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
  2. $ sudo apt-get install --no-install-recommends libboost-all-dev
  3. $ sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
  4. $ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

注:如果提示”安装无法定位软件包”,可以尝试sudo apt-get update命令

2.安装caffe

  1. $ cd ~
  2. $ git clone git://github.com/BVLC/caffe.git

3.编译caffe

  1. $ cd caffe
  2. $ cp Makefile.config.example Makefile.config (复制一份Makefile.config文件)

在Makefile.config文件中把CPU_ONLY := 1的注释给去掉,就是去掉前面的#号

接下来在caffe根目录下执行下面命令

  1. $ make all

在这个命令后,我遇到了一个报错信息,

  1. ./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory

这是hdf5路径问题造成的,可以通过下面命令来获得hdf5的路径,

  1. $ sudo find / -name hdf5.h

我找到的hdf5.h的路径为:/usr/include/hdf5/serial/hdf5.h,于是在makefile.config文件中,把文件改成下面所示:

再执行一遍上述命令,继续报错,这次是/usr/bin/ld: cannot find -lhdf5
于是同上面一个处理 去找libhdf5.so
配置文件改为:

  1. LIBRARY_DIRS := $(PYTHON_LIB) /usr/lib/x86_64-linux-gnu/hdf5/serial \
  2. /usr/local/lib /usr/lib
  1. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/include/hdf5/serial \
  2. /usr/local/include
  1. /usr/bin/ld: cannot find -lcblas
  2. /usr/bin/ld: cannot find -latlas

解决

  1. sudo apt-get install libatlas-base-dev
  2. 其他问题:
CXX/LD -o .build_release/tools/convert_imageset.bin
.build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)' .build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector >&, std::vector > const&)'
  1. .build_release/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)'
  2. collect2: error: ld returned 1 exit status
  3. make: *** [.build_release/tools/convert_imageset.bin] Error 1
  4. solution:
  5. add "opencv_imgcodecs" in Makefile.(LIBRARIES += glog gflags protobuf leveldb snappy \
  6. lmdb boost_system hdf5_hl hdf5 m \
  7. opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
    将上面黄色部分放在:# PYTHON_LIBRARIES := boost_python3 python3.5m 这行前。
  8. If you input "make all",the problem is the same again.But if you delete all the file in build(rm -rf ./build/*) before "make all"(I use make clean ),you will success.I just success
  9. github 讨论帖:https://github.com/BVLC/caffe/issues/2348

接着执行下面命令:

  1. make test
    我这里还是会报上面错 undefined reference to cv::imread(,。。。奇怪的是后面make runtest过了。

最后,

  1. $ make runtest
  2. mnist测试:
    参考:http://www.cnblogs.com/bigdata01/p/6886151.html

第一部分 下载mnist数据集
在data/mnist目录下执行:
./get_mnist.sh
 这样下载完成了4个文件:
    t10k-images-idx3-ubyte
    t10k-labels-idx1-ubyte
    train-images-idx3-ubyte
    train-labels-idx1-ubyte
但下载的是二进制文件,需要转换为LEVELDB或LMDB才能被Caffe识别。

第二部分 数据处理
在Caffe根目录下执行:
./examples/mnist/create_mnist.sh
这样在/examples/mnist/目录下生成了两个文件夹
mnist_test_lmdb
mnist_train_lmdb
每个文件夹里面各有两个文件。

第三部分 训练(LeNet-5模型)
首选将 lenet_solver.prototxt 文件中的
# solver mode: CPU or GPU
solver_mode: GPU
改为
# solver mode: CPU or GPU
solver_mode: CPU
然后执行
./examples/mnist/train_lenet.sh
进行训练。训练结束后会生成 lenet_iter_10000.caffemodel 权值文件。

第四部分 测试

执行:
./build/tools/caffe.bin test \
-model examples/mnist/lenet_train_test.prototxt \
-weights examples/mnist/lenet_iter_10000.caffemodel \
-iterations 100
查看预测结果。

最终结果:
I0520 19:50:40.672024  3989 caffe.cpp:318] Loss: 0.0273101
I0520 19:50:40.672076  3989 caffe.cpp:330] accuracy = 0.9918
I0520 19:50:40.672130  3989 caffe.cpp:330] loss = 0.0273101 (* 1 = 0.0273101 loss)

OK 完成。

  1.  

4.编译python接口

安装pip

  1. $ sudo apt-get install python-pip

执行安装依赖
根据caffe/python目录下的requirements.txt中列出的清单安装即可。
fortran编译器(gfortran)使为了安装scipy,否则会报错。

  1. cd ~/caffe
  2. sudo apt-get install gfortran
  3. cd ./python
  4. for req in $(cat requirements.txt); do pip install $req; done

回到caffe根目录

  1. sudo pip install -r python/requirements.txt

编译pycaffe接口

  1. make pycaffe -j8

此时报错

  1. python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: 没有那个文件或目录

于是,输入如下命令即可

  1. sudo apt-get install python-numpy
  1. 最后:
  1. ----------------------进入caffe /python 才可以执行其中的python脚本--------------------
  2.  
  3. zz@zz-Inspiron-5520:~$ cd caffe
  4. zz@zz-Inspiron-5520:~/caffe$ cd python
  5. zz@zz-Inspiron-5520:~/caffe/python$ python
  6. >>> import caffe

应该没有任何错误。设置下环境变量即可成功安装pycaffe了。

  1.  export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH
  1.  

在配置过程中会遇到各种问题,各种报错,最有效的办法就是百度啦。感谢以下博客
参考博客:
http://blog.csdn.net/striker_v/article/details/51615197
http://blog.csdn.net/u011762313/article/details/47262549
http://www.cnblogs.com/xuanxufeng/p/6016945.html

附:caffe入门说明,对各个文件的解释。

参考:http://blog.csdn.net/cham_3/article/details/72141753

Caffe的几个重要文件

用了这么久Caffe都没好好写过一篇新手入门的博客,最近应实验室小师妹要求,打算写一篇简单、快熟入门的科普文。
利用Caffe进行深度神经网络训练第一步需要搞懂几个重要文件:

  1. solver.prototxt
  2. train_val.prototxt
  3. train.sh

接下来我们按顺序一个个说明。

solver.prototxt

solver这个文件主要存放模型训练所用到的一些超参数:

  • net := 指定待训练模型结构文件,即train_val.prototxt
  • test_interval := 测试间隔,即每隔多少次迭代进行一次测试
  • test_initialization := 指定是否进行初始测试,即模型未进行训练时的测试
  • test_iteration := 指定测试时进行的迭代次数
  • base_lr := 指定基本学习率
  • lr_policy := 学习率变更策略,这里有介绍,可供参考
  • gamma := 学习率变更策略需要用到的参数
  • power := 同上
  • stepsize := 学习率变更策略Step的变更步长(固定步长)
  • stepvalue := 学习率变更策略Multistep的变更步长(可变步长)
  • max_iter := 模型训练的最大迭代次数
  • momentum := 动量,这是优化策略(Adam, SGD, … )用到的参数
  • momentum2 := 优化策略Adam用到的参数
  • weight_decay := 权重衰减率
  • clip_gradients := 固定梯度范围
  • display := 每隔几次迭代显示一次结果
  • snapshot := 快照,每隔几次保存一次模型参数
  • snapshot_prefix := 保存模型文件的前缀,可以是路径
  • type := solver优化策略,即SGD、Adam、AdaGRAD、RMSProp、NESTROVE、ADADELTA等
  • solver_mode := 指定训练模式,即GPU/CPU
  • debug_info := 指定是否打印调试信息,这里有对启用该功能的输出作介绍
  • device_id := 指定设备号(使用GPU模式),默认为0

用户根据自己的情况进行相应设置,黑体参数为必须指定的,其余参数为可选(根据情况选择)。

train_val.prototxt

train_val文件是用来存放模型结构的地方,模型的结构主要以layer为单位来构建。下面我们以LeNet为例介绍网络层的基本组成:

  1. name: "LeNet"
  2. layer {
  3. name: "mnist" #网络层名称
  4. type: "Data" #网络层类型,数据层
  5. top: "data" #这一层的输出,数据
  6. top: "label" #这一层的输出,标签
  7. include { phase: TRAIN } #TRAIN:=用于训练,TEST:=用于测试
  8. transform_param { scale: 0.00390625 } #对数据进行scale
  9. data_param { #数据层配置
  10. source: "examples/mnist/mnist_train_lmdb" #数据存放路径
  11. batch_size: 64 #指定batch大小
  12. backend: LMDB #指定数据库格式,LMDB/LevelDB
  13. }
  14. }
  15. layer {
  16. name: "mnist"
  17. type: "Data"
  18. top: "data"
  19. top: "label"
  20. include { phase: TEST }
  21. transform_param { scale: 0.00390625 }
  22. data_param {
  23. source: "examples/mnist/mnist_test_lmdb"
  24. batch_size: 100
  25. backend: LMDB
  26. }
  27. }
  28. layer{
  29. name:"conv1"
  30. type:"Convolution" #卷积层
  31. bottom:"data" #上一层的输出作为输入
  32. top:"conv1"
  33. param{name:"conv1_w" lr_mult:1 decay_mult:1} #卷积层参数w的名称,学习率和衰减率(相对于base_lr和weight_decay的倍数)
  34. param{name:"conv1_b" lr_mult:2 decay_mult:0} #卷积层参数b的名称,学习率和衰减率
  35. convolution_param{
  36. num_output:20 #卷积层输出的feature map数量
  37. kernel_size:5 #卷积层的大小
  38. pad:0 #卷积层的填充大小
  39. stride:1 #进行卷积的步长
  40. weight_filler{type:"xavier" } #参数w的初始话策略
  41. weight_filler{type:"constant" value:0.1} #参数b的初始化策略
  42. }
  43. }
  44. layer {        #BatchNorm层,对feature map进行批规范化处理
  45. name:"bn1"
  46. type:"BatchNorm"
  47. bottom:"conv1"
  48. top:"conv1"
  49. batch_norm_param{ use_global_stats:false} #训练时为false,测试时为true
  50. }
  51. layer { #池化层,即下采样层
  52. name: "pool1"
  53. type: "Pooling"
  54. bottom: "conv1"
  55. top: "pool1"
  56. pooling_param {
  57. pool: MAX #最大值池化,还有AVE均值池化
  58. kernel_size: 2
  59. stride: 2
  60. }
  61. }
  62. layer {
  63. name: "conv2"
  64. type: "Convolution"
  65. bottom: "pool1"
  66. top: "conv2"
  67. param { lr_mult: 1 }
  68. param { lr_mult: 2 }
  69. convolution_param {
  70. num_output: 50
  71. kernel_size: 5
  72. stride: 1
  73. weight_filler { type: "xavier" }
  74. bias_filler { type: "constant" }
  75. }
  76. }
  77. layer {
  78. name:"bn2"
  79. type:"BatchNorm"
  80. bottom:"conv2"
  81. top:"conv2"
  82. batch_norm_param{ use_global_stats:false}
  83. }
  84. layer {
  85. name: "pool2"
  86. type: "Pooling"
  87. bottom: "conv2"
  88. top: "pool2"
  89. pooling_param {
  90. pool: MAX
  91. kernel_size: 2
  92. stride: 2
  93. }
  94. }
  95. layer {     #全连接层
  96. name: "ip1"
  97. type: "InnerProduct"
  98. bottom: "pool2"
  99. top: "ip1"
  100. param { lr_mult: 1 }
  101. param { lr_mult: 2 }
  102. inner_product_param {
  103. num_output: 500
  104. weight_filler { type: "xavier" }
  105. bias_filler { type: "constant" }
  106. }
  107. }
  108. layer { #激活函数层,提供非线性能力
  109. name: "relu1"
  110. type: "ReLU"
  111. bottom: "ip1"
  112. top: "ip1"
  113. }
  114. layer {
  115. name: "ip2"
  116. type: "InnerProduct"
  117. bottom: "ip1"
  118. top: "ip2"
  119. param { lr_mult: 1 }
  120. param { lr_mult: 2 }
  121. inner_product_param {
  122. num_output: 10
  123. weight_filler { type: "xavier" }
  124. bias_filler { type: "constant" }
  125. }
  126. }
  127. layer { #损失函数层
  128. name: "prob"
  129. type: "SoftmaxWithLoss"
  130. bottom: "ip2"
  131. bottom: "label"
  132. top: "prob"
  133. }

参数初始化策略可参考这里, 激活函数可参考这里

网络结构和超参数都设计完了,接下来就可以进行模型训练了。这里我介绍最常用的模型训练脚本,也是Caffe官方文档给的例子。

train.sh

这个脚本文件可写,可不写。每次运行需要写一样的命令,所以建议写一下。

  1. TOOLS=/path/to/your/caffe/build/tools
  2. GLOG_logtostderr=0 GLOG_log_dir=log/ \ #该行用于调用glog进行训练日志保存,使用时请把该行注释删除,否则会出错
  3. $TOOLS/caffe train --solver=/path/to/your/solver.prototxt #--snapshot=/path/to/your/snapshot or --weights=/path/to/your/caffemodel ,snapshot和weights两者只是选一,两个参数都可以用来继续训练,区别在于是否保存solver状态
  • 1
  • 2
  • 3

数据准备

这里我们举个简单的例子,改代码是Caffe官方文档提供的,但只能用于单标签的任务,多标签得对源码进行修改。该脚本是对图片数据生成对应的lmdb文件,博主一般使用原图,即数据层类型用ImageData。

  1. #!/usr/bin/env sh
  2. # Create the imagenet lmdb inputs
  3. # N.B. set the path to the imagenet train + val data dirs
  4. set -e
  5. EXAMPLE="" #存储路径
  6. DATA="" #数据路径
  7. TOOLS=/path/to/your/caffe/build/tools #caffe所在目录
  8. TRAIN_DATA_ROOT="" #训练数据根目录
  9. VAL_DATA_ROOT="" #测试数据根目录
  10. # RESIZE=true to resize the images to 256x256. Leave as false if images have
  11. # already been resized using another tool.
  12. RESIZE=false #重新调整图片大小
  13. if $RESIZE; then
  14. RESIZE_HEIGHT=256
  15. RESIZE_WIDTH=256
  16. else
  17. RESIZE_HEIGHT=0
  18. RESIZE_WIDTH=0
  19. fi
  20. #检测路径是否存在
  21. if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  22. echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  23. echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
  24. "where the ImageNet training data is stored."
  25. exit 1
  26. fi
  27. if [ ! -d "$VAL_DATA_ROOT" ]; then
  28. echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  29. echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
  30. "where the ImageNet validation data is stored."
  31. exit 1
  32. fi
  33. echo "Creating train lmdb..."
  34. GLOG_logtostderr=1 $TOOLS/convert_imageset \
  35. --resize_height=$RESIZE_HEIGHT \
  36. --resize_width=$RESIZE_WIDTH \
  37. --shuffle \
  38. $TRAIN_DATA_ROOT \
  39. $DATA/train.txt \ #训练图片列表,运行时请把该行注释删除,否则会出错
  40. $EXAMPLE/mnist_train_lmdb
  41. echo "Creating val lmdb..."
  42. GLOG_logtostderr=1 $TOOLS/convert_imageset \
  43. --resize_height=$RESIZE_HEIGHT \
  44. --resize_width=$RESIZE_WIDTH \
  45. --shuffle \
  46. $VAL_DATA_ROOT \
  47. $DATA/val.txt \
  48. $EXAMPLE/mnist_test_lmdb
  49. echo "Done."

这样,我们就可以愉快的开始训练啦。

Ubuntu17.10 下配置caffe 仅CPU i386可以直接apt install caffe-cpu,但是怎么运行mnist代码我懵逼了的更多相关文章

  1. suse linux 10 下配置vpn服务器(pptp)

     一.安装所需的软件包:      pptpd-*.rpm      ppp-*.rpm      pptp-*.rpm     一般情况下系统已经将pptp和ppp包安装好了,所以只需安装pptpd ...

  2. Ubuntu17.10下编译Openjdk8u

    一开始笔者用的系统和软件版本都是最新的,导致编译了好几次都失败,最后找到解决的办法,现在记录一下编译及解决的方法 避免以后忘记 所用操作系统 Ubuntu17.10 所用软件及版本 make 3.8. ...

  3. Ubuntu18.10下配置PHP7.2 + Apache2 + Mysql5.7

    方案1:集成解决方案 1.lnmphttps://lnmp.org/ 2.xampphttps://www.apachefriends.org/zh_cn/index.html 3.oneinstac ...

  4. VS2015+Windows 10下配置opencv3.0

    博客园样式换了,原先的文章排版太乱了,新发一篇 ##0. 安装 opencv 3.0 首先去官网下载安装包(其实是个压缩包),释放到随便的一个路径里面为了方便描述,下面把这个路径称为 cvPath. ...

  5. windows 10 下配置安装node.js

      环境配置 node.js windows10 25.5k 次阅读  ·  读完需要 6 分钟 5 在去年就自己配置安装过node.js,但是使用npm安装模块时安装成功后调用require('mo ...

  6. Ubuntu17.10下启动Rancher

    1.安装Docker: 获取最新的docker安装包 wget -qO- https://get.docker.com/ | sh 2.启动docker后台服务: service docker sta ...

  7. 【教程】ubuntu下配置nvc详细教程

    Preface 虽然以前在windows上远控linux都是用的FTP+CRT,不过有些时候还是不太方便,比如不能用IDE对程序进行调试,现在就来配置下VNC,过程中出了些错误,上网查询时发现很多解决 ...

  8. ubuntu17.10 安装CUDA

    1. 更新apt-get源列表 sudo apt-get update sudo apt-get upgrade 2. 添加驱动源 sudo add-apt-repository ppa:graphi ...

  9. Caffe学习系列(一)Ubuntu16.04下搭建编译Caffe环境,并运行MNIST示例(仅CPU)

    前言: 正文: 1.安装必要依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev l ...

随机推荐

  1. Android icon尺寸

    Android icon尺寸   密度范围 切图比例(以mdpi为基准) 切图比例(以xxxhdpi为基准) 图标尺寸 外间距 ((图标尺寸-图片尺寸)/2) mdpi 120dpi~160dpi 1 ...

  2. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  3. html5——伸缩比例

    基本概念 1.父盒子设置了伸缩属性,子盒子设置伸缩比例 2.以上设置完之后子盒子会按照比例分布在父盒子中 3.当设置伸缩比例时默认会按照x轴方向分配,因为默认情况下伸缩布局主轴方向是x轴方向 4.设置 ...

  4. JS——大小写转化

    <script> var str = 'JavaScript'; console.log(str.toUpperCase());//小写转大写 console.log(str.toLowe ...

  5. 控制台——屏蔽Ctrl+C快捷键对窗体的关闭功能

    导入SetCtrlHandlerHandler API //定义处理程序委托 public delegate bool ConsoleCtrlDelegate(int ctrlType); //导入S ...

  6. 批量注释LOG

    sed -i "s/LOG/\/\/ LOG/g" `grep LOG\(TRACE\) -rl .`

  7. 三年半Java后端面试鹅厂,三面竟被虐的体无完肤

    经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征. 鹅厂 面试职位: go后端开发工程师,接受从Java转语言 都知道鹅厂是cpp的主战场,而以cpp为背 ...

  8. poj3176-Cow Bowling【dp】

    The cows don't use actual bowling balls when they go bowling. They each take a number (in the range ...

  9. (转载)python应用svm算法过程

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  10. 优雅的退出/关闭/重启gunicorn进程

    在工作中,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,经过我一番百度和谷歌,发现想要删除gunicorn进程其实很简单. 第一步获取Guni ...