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
20
net :=指定待训练模型结构文件,若没有明确指定训练和测试网络,即
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.prototxt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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_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解决梯度弥散