一、Caffe基础
1、Caffe主要依赖项
- CUDA(Compute Unified Device Architecture),是英伟达公司推出的一种基于新的并行编程模型和指令集架构的通用计算架构,它能利用英伟达GPU的并行计算引擎,比CPU更高效的解决许多复杂计算任务。
- NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。
- Opencv. (Linux下查看版本:pkg-config --modversion opencv)
2、Caffe中的网络都是有向无环图的集合,可以直接定义
3、数据及其导数以blobs的形式在层间流动。每一层用bottom来输入数据,用top来输出数据。Caffe层的定义由2部分组成:层属性与层参数。
4、Slice layer用来做multi-task或者multi-label学习,将一个Vector分成多个Vector。Slience层用来接收slice出的不需要的层,使其不被打印出来。
5、Blob是用以存储数据的4维数组,例如
- 对于数据:Number*Channel*Height*Width
- 对于卷积权重:Output*Input*Height*Width
- 对于卷积偏置:Output*1*1*1
6、关于可视化:https://blog.csdn.net/BockSong/article/details/81979822
二、Caffe编译
初次安装caffe,或是修改caffe源码后,都需要进行编译。编译时首先要准备好所需的依赖项,然后生成并根据需要修改makefile和makefile.config文件。
之后执行如下指令:
make clean
make all
编译中遇到了一些问题,解决过程记录在另一篇博客:https://blog.csdn.net/BockSong/article/details/81738610
三、数据处理
Caffe支持三种数据库格式:LevelDB, LMDB, HDF5。
LMDB文件操作可以参考:https://blog.csdn.net/BockSong/article/details/81238276
四、配置文件编写
1、solver.prototxt
net: "examples/AAA/train_val.prototxt" #训练或者测试配置文件
test_iter: 40 #完成一次测试需要的迭代次数
test_interval: 475 #测试间隔
base_lr: 0.01 #基础学习率
lr_policy: "step" #学习率变化规律
gamma: 0.1 #学习率变化指数
stepsize: 9500 #学习率变化频率
display: 20 #屏幕显示间隔
max_iter: 47500 #最大迭代次数
momentum: 0.9 #动量
weight_decay: 0.0005 #权重衰减
snapshot: 5000 #保存模型间隔
snapshot_prefix: "models/A1/caffenet_train" #保存模型的前缀
solver_mode: GPU #是否使用GPU
2、train_val.prototxt
train_val.prototxt文件是网络配置文件。该文件是在训练的时候用的。
3、deploy.prototxt
该文件是在测试时使用的文件。
相关资料:
makefile.config https://blog.csdn.net/jiajunlee/article/details/52068230
makefile https://blog.csdn.net/thystar/article/details/50837750
五、Python接口
1、net.blobs解析
其类型是 collections.OrderedDict(即有序字典),字典的值类型为 caffe._caffe.Blob,caffe._caffe.Blob 的 data 属性类型是 numpy.ndarray。
在 Caffe 的 python/caffe/_caffe.cpp 文件中:
.add_property("data", bp::make_function(&Blob<Dtype>::mutable_cpu_data,
NdarrayCallPolicies()))
在 Caffe 的 src\caffe\blob.cpp 文件中
template <typename Dtype>
Dtype* Blob<Dtype>::mutable_cpu_data() {
CHECK(data_);
return static_cast<Dtype*>(data_->mutable_cpu_data());
}
2、中间层的可视化
读取网络的结构(每层的名字以及相应层的参数)。net.blob对应网络每一层数据,对于每一层,都是四个维度:(batch_size, channel_dim, height, width)。
# 循环打印每一层名字和相应维度
for layer_name, blob in net.blobs.iteritems():
print layer_name + '\t' + str(blob.data.shape)