前言:
通过检索论文、书籍、博客,继续学习Caffe,千里之行始于足下,继续努力。将自己学到的一些东西记录下来,方便日后的整理。
正文:
1、代码结构梳理
在终端下运行如下命令,可以查看caffe代码结构,我将其梳理了一下:
root@ygh:/home/ygh/caffe# tree -d . ├── build -> .build_release //编译结果存放处,子目录结构与主目录类似 ├── cmake //使用CMake编译时会用到 │ ├── External │ ├── Modules │ └── Templates ├── data //用于存放原始数据及数据获取的脚本sh文件 │ ├── cifar10 │ ├── ilsvrc12 │ └── mnist ├── distribute //编译后生成发布包的位置,用于迁移 │ ├── bin │ └── lib ├── docker //同样为了便于迁移,使用了Docker工具 │ ├── cpu │ └── gpu ├── docs //doxygen工程文件放在这里,可生成Caffe ref_man.pdf │ ├── images │ ├── _layouts │ ├── stylesheets │ └── tutorial │ ├── fig │ └── layers ├── examples //存放Caffe简单例程 │ ├── cifar10 //CIFAR10例程 │ ├── cpp_classification //图像分类例程 │ ├── feature_extraction //特征提取例程 │ ├── finetune_flickr_style //finetune例程 │ ├── finetune_pascal_detection //finetune例程 │ ├── hdf5_classification //使用HDF5数据源的分类例程 │ ├── imagenet //ImageNet例程,使用bvlc_reference_caffenet模型 │ ├── images │ ├── mnist //MNIST手写数字识别例程 │ │ ├── mnist_test_lmdb │ │ └── mnist_train_lmdb │ ├── net_surgery │ ├── pycaffe │ │ └── layers │ ├── siamese │ └── web_demo //一个Web Server + 分类例程 │ └── templates ├── include //Caffe头文件集中存放此目录 │ └── caffe │ ├── layers │ ├── test │ └── util ├── Install-OpenCV │ ├── ArchLinux │ ├── RedHat │ └── Ubuntu │ ├── 2.3 │ └── 2.4 ├── matlab //适用于Matlab做Wrapper,具体可以参考RCNN源码 │ ├── +caffe │ │ ├── imagenet │ │ ├── private │ │ └── +test │ ├── demo │ └── hdf5creation ├── models //存放示例模型 │ ├── bvlc_alexnet //经典的AlexNet │ ├── bvlc_googlenet //GoogLeNet │ ├── bvlc_reference_caffenet //Caffe模型的AlexNet │ ├── bvlc_reference_rcnn_ilsvrc13 //RCNN模型 https:github.com/rbgirshick/rcnn │ └── finetune_flickr_style ├── python //用于python Wrapper │ └── caffe │ ├── imagenet │ ├── proto │ └── test ├── scripts //存放脚本 │ └── travis ├── src //Caffe源码 │ ├── caffe │ │ ├── layers //各个层的具体实现 │ │ ├── proto //proto描述文件,学习数据结构先从这里开始 │ │ ├── solvers │ │ ├── test │ │ │ └── test_data │ │ └── util │ └── gtest └── tools //常用工具源码 └── extra
2、相关知识点
训练网络时,需要由数据读取层(DataLayer)不断地从LMDB读取数据,送入后续卷积、下采样等计算层。
数据读取层声明位于 include/caffe/data_layer.hpp中
数据变换器(DataTransformer)主要提供了对原始输入图像的预处理方法,包括随机切块、随机镜像、幅度缩放、去均值、灰度/色度变换等。声明头文件位于 include/Caffe/data_transformer.hpp中
求解器实现:
Caffe中的求解器有以下几种:
1、随机梯度下降法(Stochastic Gradient Descent,SGD),最常用
2、AdaDelta
3、自适应梯度法(Adaptive Gradient,ADAGRAD)
4、Adam
5、Nesterov加速梯度法(Nesterov's Accelerated Gradient,NAG)
6、RMSprop
solver.prototxt中格式
base_lr:0.01 //基准学习速率为0.01,另外每个Layer会在基准上进行细调
lr_policy:"step" //学习速率衰减策略,step为步进方式,即每进行step次迭代,学习速率更新一次
gamma:0.1 //学习速率衰减常数,每次更新学习速率都是乘上这个固定常数
stepsize:100000 //每10万次迭代,对学习速率进行一次更新
max_iter:350000 //训练总共需要35万次迭代
momentum:0.9 //遗忘因子为0.9