一 Caffe模块包括四个部分
- Blob:Caffe中数据的封装,用于layer上流动:
Blob四维连续数组,通常表示为(n,k,w,h),是基础的数据结构。可表示输入输出数据,也可表示参数数据
2. Layer:输入层,输出层,神经网络层的抽象
Layer网络基本单元,每一层定义了三种运算:初始化网络参数,前向传播,后向传播
3.Net:神经网络结构,将Layer层叠关联起来
Net为无回路有向图
初始化函数:创建blobs和layers;调用layers的setup函数来初始化layers
forward和backward
4.Solver:定义神经网络训练和测试参数
创建训练网络和测试网络
周期性的测试网络
调用前向和反向函数进行的迭代优化和参数更新
solver每轮迭代都会通过前向函数计算输出和损失(loss),还用反向传播来计算梯度
二 caffe model
- 用于保存和恢复网络参数,后缀为.caffemodel
- solver保存和恢复运行状态,后缀为.solverstate
三 caffe环境配置
四 caffe源码解读
1.文件夹结构说明
data:用于存放下载的训练数据
docs:帮助文档
examples:一些代码样例
matlab:matlab接口文件
python:python接口文件
model:一些配置好的模型参数
scripts:一些文档和数据用到的脚本
2.核心代码文件夹:
tools:保存的源码是用于生成二进制处理程序的,也是我们直接使用命令行训练时候的工具
include:caffe的头文件.hpp,命名方式一般为网络名字开头
src:caffe的源文件:.cpp,.cu。其中.cpp文件对应到了cpu版本的代码,.cu文件对应到了gpu版本的代码
3.src/caffe核心源码结构
test:用gtest测试caffe的源码
util:数据转换时用的一些代码
proto:是一种数据存储格式,帮助caffe提速,注意,我们在添加网络的时候,需要在这个文件中添加相应的配置,除此之外, 还需要添加相应的.hpp和.cpp文件到include和src中
layers:定义并实现了网络的前向,反向等方法
solvers:定义并实现了一系列优化方法,如SGD,Adam等
五 caffe配置文件介绍
solver.prototxt:配置模型训练的超参数:
- net := 指定待训练模型结构文件,若没有明确指定训练和测试网络,即train_val.prototxt
- test_interval := 测试间隔
- test_iteration := 测试时进行的迭代次数,等于测试集容量/测试网络的batch size
- base_lr := 基本学习率
- lr_policy := 学习率变更策略
- gamma := 学习率变更策略需要用到的参数
- power := 学习率变更策略需要用到的参数
- stepsize := 学习率变更策略Step的变更步长(固定步长)
- stepvalue := 学习率变更策略Multistep的变更步长(可变步长)
- max_iter := 模型训练的最大迭代次数
- momentum := 动量,是优化策略(Adam,SGD,...)用到的参数,如果我们不采用相应的优化策略,这个参数就不用配置
- momentum2 := 优化策略Adam用到的参数
- weight_decay := 权重衰减率
- display := 每隔几次迭代显示一次结果
- snapshot := 快照,每隔几次保存一次模型参数
- snapshot_prefix := 保存模型文件的前缀,可以是路径
- type := solver优化策略,即SGD,Adam等
- solve_mode := 指定训练模式,即CPU/GPU
- device_id := 指定设备号(使用GPU模式),默认为0
train_val.prototxt:训练网络
训练时通常将训练网络,测试网络定义为train_val.prototxt或分开定义为train.prototxt和test.prototxt
例如
name:"Lenet"
layer{
name:"mnist"
type:"Data"
top:"data"
top:"label"
include{
phase:TRAIN
}
transform_param{
scale:0.00390625
}
data_param{
source:"examples/mnist/mnist_train_lmdb"
batch size:64
backend:LMDB
}
deploy.prorotxt:测试网络
在网络训练完成时,往往通过deploy.prorotxt文件进行网络测试
deploy.prorotxt和train_val.prototxt的主要区别在于:
1. deploy.prorotxt没有反向传播部分,因而没有loss层
2. deploy.prorotxt会去掉数据层,只需告诉输入的数据维度
3.deploy.prorotxt中将BN层的use_global_stats设置为true
deploy.prorotxt有以下两种定义方式:
第一种:
layer{
name:"data"
type:"input"
top:"data"
input_param{shape:{dim:10 dim:3 dim:32 dim:32}}
第二种:
input:"data"
input_shape{
dim:1# batchsize
dim:1# number of colour channels -rgb
dim:28# width
dim:29# height}
六 深度学习标准层在caffe中定义
数据输入层:Data,ImageData,MemoryData等
视觉层:包括Convolution,Pooling,BN,LRN,im2col等
激活层:relu,sigmoid等
损失层:softmax_loss,Euclidean等
循环层:RNN, LSTM等
工具层:reshape,concat,flatten,slice等
layer{
name:"xx" #层名
type:"xx" #类型
top:"xx" #输出
bottom:"xx" #输入
some_param {#其他参数定义等...}