Caffe 基本介绍
文章目录
Caffe(Convolutional Architecture for Fast Feature Embedding),纯粹的C++/CUDA架构,支持命令行、Python和MATLAB,可以在CPU和GPU之间无缝切换。
Caffe基本概念
Caffe模块包括4个部分
Blob
Blob:Caffe中数据的封装,用于layer上流动。Blob其实就是空间连续的多维数组,比如存储图像的时候是个四维数组,通常表示为(n,k,w,h)分别是样本个数、通道数、图像高度、图像宽度。可表示输入输出数据,也可表示参数数据
Layer
Layer:输入层、输出层、神经网络层的抽象。网络的基本单元,每一层类型定义了3种计算。
- 初始化网络参数
- 创建blobs和layers
- 调用layers的setup函数来初始化layers
- 前向传播
- 后向传播
Net
Net:神经网络结构,将layer层叠关联起来。
- Net为无回路的有向图。
Solver
Solver:定义神经网络训练和测试参数。
- 创建训练网络、测试网络
- 周期性的测试网络
- 调用前向和反向函数进行的迭代优化和参数更新
- solver每轮迭代都会通过前向函数计算输出和损失(loss),还用反向传播来计算梯度
caffe model
- 用于保存和恢复网络参数,后缀为.caffemodel
- solver保存和恢复运动状态,后缀为.solverstate
Caffe源码解读
- data:用于存放下载的训练数据
- docs:帮助文档
- examples一些代码样例
- matlab:Matlab接口文件
- python:Python接口文件
- models:一些配置好的模型参数
- scripts:一些文档和数据用到的脚本
- tools:保存的源码是用于生成二进制处理程序的,也是我们直接使用命令行训练时候的工具
- include:Caffe的有文件.hpp,命名方式一般为网络名字开头
- src:Caffe的源文件.cpp(CPU) .cu(GPU)
- src/caffe
- test:用gtest测试caffe的代码
- util:数据转换时用的一些代码
- proto:是一种数据存储格式,帮助caffe提速,注意:在添加网络的时候,需要在这个文件中添加相应的配置,除此之外,还需要添加相应的.hpp和.cpp文件到include和src中
- layers:定义并实现了网络的前向、反向等方法
- Solvers:定义并实现了一系列优化方法,如SGD、Adam等
Caffe配置文件
solver.prototxt
配置模型训练的超参数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20net :=指定待训练模型结构文件,若没有明确指定训练和测试网络,即
train_val.prototxt
test_interval :=测试间隔
test_iteration :=测试时进行的迭代次数,等于测试集容量/测试网络的batch size
base_lr :=基本学习率
Impolicy 学习率变更策略
gamma :=学习率变更策略需要用到的参数
power :=同上
stepsize 学习率变更策略Step的变更步长(固定步长)
stepvalue :=学习率变更策略Multistep的变更步长(可变步长)
max_iter :=模型训练的最大迭代次数
momentum :=动量,这是优化策略(Adam, SGD,…)用到的参数
momentum2 :=优化策略Adam用至丨」的参数
weight_decay :=权重衰减率
display 每隔几次迭代显示一次结果
snapshots快照,每隔几次保存一次模型参数
snapshot prefix :=保存模型文件的前缀,可以是路径
type := solver优化策略,即SGD、Adam等
solver_mode :=指定训练模式,即GPU/CPU
devicejd :=指定设备号(使用GPU模式),默认为0
train_val.prototxt
训练网络,训练时通常将训练网络、测试网络定义为train_val.prototxt或分开定义为train.prototxt和test.prototxt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17name: "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_lmdbn
batch_size: 64 backend: LMDB
}
}
phase:TRAIN表示应用于train网络中,TEST用在test网络中,去掉该参数,该层会同时出现在训练网络和测试网络。比如loss层,训练网络需要loss计算精度,而在测试网络中不需要loss。
在配置文件中可以通过include参数将该层配置到训练网络或是测试网络。
deploy.prototxt
进行网络测试。
deploy.prototxt与train_val.prototxt的区别在于
- deploy.prototxt没有反向传播部分,因而没有loss层;
- deploy.prototxt会去掉数据层,只需要告诉输入的数据维度;
- deploy.prototxt中将BN层的use_global_stats设置为true
Caffe可视化工具
http://ethereon.github.io/netscope/#/editor
深度学习标准层在Caffe中定义
- 数据输入层:Data、ImageData、MemoryData
- 视觉层:Convolution、Pooling、BN、LRN、im2col
- 激活层:ReLU、Sigmoid
- 损失层:softmax-loss、Euclidean
- 循环层:RNN、LSTM
- 工具层:reshape、concat、flatten、slice
- 普通层:dropout、全连接embed层
Layer的定义
Caffe中特殊层的添加
- 在./src/caffe/proto/caffe.proto中增加新layer的paramter message
- 在./include/caffe/路径下增加新layer的声明文件:**.hpp
- 在./src/caffe/layers/目录下实现新层,.cpp .cu
- 当需要对网络做微调或更进一步的训练时,可以采取模型fineune;若网络模型有改动,则需要修改相应的层名
- sudo sh caffe train –solver=solver.prototxt -weights=net.caffemodel #通过weights加载预训练模型
Caffe中参数共享
Caffe网络通用设计技巧
Inception结构
使用多个卷积核组合获得更丰富的特征
ResNet结构
Skip connect解决梯度弥散