isyanan1024 / caffe

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

环境

ubuntu16.04

CUDA10

Cudnn7

安装

创建容器

该镜像已经装好了cuda10和cudnn7

nvidia-docker run -it --name yanan_caffe nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04

###anaconda

版本为Anaconda3-2.4.1-Linux-x86_64.sh,该版本python为3.5,方便后面Boost的安装

Anaconda3-2.4.1-Linux-x86_64.sh

加入环境变量

export PATH=/root/anaconda3/bin/:$PATH
source ~/.bashrc

检查安装是否成功

python

换apt-get源

apt-get update
apt-get upgrade -y

安装库文件

以下命令每个可以运行两遍,确保每个库都完整的安装

apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler -y
apt-get install --no-install-recommends libboost-all-dev -y
apt-get install libopenblas-dev liblapack-dev libatlas-base-dev -y
apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev -y
apt-get install git cmake build-essential -y

###配置环境变量

vim ~/.bashrc

在最后添加下面内容

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

###安装Opencv

unzip OpenCV-3.4.5.zip
mv opencv-opencv-b7b8767/ opencv
cd opencv

mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8
make install

检查是否安装成功

pkg-config --modversion opencv

出现版本号即成功

加入环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

###安装caffe

下载源码或者在服务器上拉压缩文件

git clone https://github.com/BVLC/caffe.git
unzip caffe-master.zip
mv caffe-master caffe
cd caffe

#将 Makefile.config.example 文件复制一份并更名为 Makefile.config 
cp Makefile.config.example Makefile.config

修改Makefile.config

  • 修改:
#USE_CUDNN := 1
#WITH_PYTHON_LAYER := 1

为:

USE_CUDNN := 1
WITH_PYTHON_LAYER := 1
  • 修改:
#OPENCV_VERSION := 3

为:

OPENCV_VERSION := 3
  • 修改(根据自己的GPU型号决定):
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

为:

CUDA_ARCH := -gencode arch=compute_61,code=compute_61
  • 修改:
# PYTHON_LIBRARIES := boost_python3 python3.5m

为:

PYTHON_LIBRARIES := boost_python-py35 python3.5m
  • 注释掉:
PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include

为:

#PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include
  • 启用:
# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                # $(ANACONDA_HOME)/include/python2.7 \
                # $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

为:

ANACONDA_HOME := /root/anaconda3
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                $(ANACONDA_HOME)/include/python3.5m \
                $(ANACONDA_HOME)/lib/python3.5/site-packages/numpy/core/include
  • 注释:
PYTHON_LIB := /usr/lib

为:

#PYTHON_LIB := /usr/lib
  • 启用:
# PYTHON_LIB := $(ANACONDA_HOME)/lib

为:

PYTHON_LIB := $(ANACONDA_HOME)/lib
  • 修改:
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

修改Makefile文件

  • 修改:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m

为:

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
  • 修改:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)

为:

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

编译

make all -j32
 
#测试
make runtest -j8

可能会出现下面的错误:

liblapack.so.3: undefined symbol: gotoblas

解决方法:

update-alternatives --config libblas.so.3
update-alternatives --config liblapack.so.3

两个都选择atlas下的库即可

安装pycaffe

make pycaffe -j32

可能会出现这个错误:

fatal error: Python.h: No such file or directory
compilation terminated.

解决方法:检查Makefile.config中的Python路径有没有写对

添加环境变量:

echo export PYTHONPATH="/home/yanan/caffe/python" >> ~/.bashrc
source ~/.bashrc

安装ptotobuf

pip install protobuf==3.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

验证安装是否成功

python
import caffe

没报错即成功

全局使用caffe

export PATH=$PATH:/home/yanan/caffe/build/tools/
source ~/.bashrc

验证

caffe

出来相关信息即可

MNIST

caffe流程

准备数据-->定义Net-->配置Solver-->Run-->分析结果

准备数据

先下载准备好的数据,在caffe目录下运行

./data/mnist/get_mnist.sh

在~/caffe/data/mnist下有四个文件t10k-labels-idx1-ubyte、train-labels-idx1-ubyte、t10k-images-idx3-ubyte和train-images-idx3-ubyte

  1. 将数据转换成LMDB格式
./examples/mnist/create_mnist.sh

在~/caffe/examples/mnist下多出mnist_test_lmdb和mnist_train_lmdb两个文件夹

定义Net

参考~/caffe/module_install_desc/mnist/mnist.prototxt

注意:需要修改两个source的数据集位置

配置Solver

参考~/caffe/module_install_desc/mnist/mnist_solver.prototxt

snapshot: 5000--每5000次保存一下模型

snapshot_prefix: "weights/snapshot"--模型保存的路径,snapshot为模型的开头名

RUN

预估训练模型需要多久

caffe time -model ./caffe_mnist/hbk_mnist.prototxt -iterations 10 -gpu 0

-model:prototxt文件位置

-iterations:迭代次数,次数越多计算模型需要的时间越准确

-gpu:可选项,选择使用哪个GPU

训练

caffe train -solver mnist_solver.prototxt 2>&1 | tee train.log

分析结果

画网络结构图

  • 安装graphviz:apt-get install graphviz
  • 安装pydotplus:pip install pydotplus
python /home/yanan/caffe/python/draw_net.py mnist.prototxt --rankdir=LR net.png
Drawing net to net.png

第一个参数说明prototxt文件位置

第二个参数说明画图风格,可以选择TB(从上往下)、LR(从左往右)

第三个参数说明图片保存的名称

注意:prototxt文件中不要带中文,不然会报错

用网页画结构图

登陆http://ethereon.github.io/netscope/#/editor,复制prototxt内容到网页中,按shift+enter即可

分析训练数据

将分析数据的脚本模板复制一份

cp /home/yanan/caffe/tools/extra/plot_training_log.py.example /home/yanan/caffe/tools/extra/plot_training_log.py

根据序列号可以画出以下几种图

0: Test accuracy  vs. Iters
1: Test accuracy  vs. Seconds
2: Test loss  vs. Iters
3: Test loss  vs. Seconds
4: Train learning rate  vs. Iters
5: Train learning rate  vs. Seconds
6: Train loss  vs. Iters
7: Train loss  vs. Seconds

运行程序前需要保存训练的log,在训练的时候在指令后加上2>&1 | tee train.log

python /home/yanan/caffe/tools/extra/plot_training_log.py 6 pars.png train.log

第一个参数:需要画出哪种数据的表格,参照上面的序列号

第二个参数:表格的名称

第三个参数:训练的log日志

注意事项

  1. 出错:'dict_keys' object does not support indexing

修改plot_training_log.py第95行为:

return list(markers.keys())[idx]
  1. 出错:Invalid DISPLAY variable

import matplotlib.markers as mks

下,添加:

plt.switch_backend('agg')
  1. 同时会把train.log分成train.log.train和train.log.test两个文本表格,可以更方便的观察数据

Layer

数据层和网络层都是Layer的实现

Net

是一堆Layer的组合

Solver

是迭代算法

solver = caffe.SGDSolver("")

通过读取Solver配置生成Solver对象,通过这个对象就可以获取到

#训练用的net
solver.net
#测试用的net
solver.test_net[0]

solver.net还可以调用

solver.net.forward()

可以通过

solver.step(num)

表示算法需要迭代多少次,如果使用

solver.solver()

则相当于运行了caffe train,会按照solver的配置文件进行迭代

solver.net.blobs['data']

blobs是caffe自定义的一种数据格式,可以理解为字典

solver.net.params['ip1'][0]

params表示权值,[0]表示权重,[1]表示偏置项

pycaffe mnist

运行程序(在pycaffe_mnist文件夹下)

python -i train.py

进入交互模式后,输入

solver.net:<caffe._caffe.Net object at 0x7f0796e63ce8>

solver.net.blobs:输出字典格式的数据:

OrderedDict([('data', <caffe._caffe.Blob object at 0x7f0796e63be0>), ('label', <caffe._caffe.Blob object at 0x7f0796e63c38>), ('ip1', <caffe._caffe.Blob object at 0x7f0796e63ef8>), ('ip2', <caffe._caffe.Blob object at 0x7f0796e63d40>), ('loss', <caffe._caffe.Blob object at 0x7f0796e63e48>)])

solver.net.blobs['ip1'].data.shape:输出该节点的输入输出维度(64, 500)

solver.net.params['ip1'][0].data.shape:输入对应节点的权重维度(500, 784)

注意事项

  1. 只在测试阶段打印准确率
n.accu = L.Accuracy(n.ip2, n.label, include={'phase':caffe.TEST})
  1. 使用GPU需添加如下代码
caffe.set_mode_gpu()
caffe.set_device(0)
  1. solvestate用来恢复训练,例如:
caffe train --solver=examples/test/solver.prototxt --snapshot=examples/test/test_100000.solverstate 

About


Languages

Language:Python 100.0%