1. 前向传播
(1)前向传播时,由数据读取层获取数据,经过逐层处理,带最后一层(可能是损失层或特征层)得到输出。
(2)网络路径实际上是一个有向无环图(Directed Acycline Graph),DAG。
(3)DAG构造过程。从.prototxt文件读取网络结构,并获得NetParameter对象的初始化值,使用Init()函数实现初始化。Init()完成网络初始化和层初始化的操作。
(4)Net Forward的实现。对于每个Layer,调用Forward()函数,得到每层的loss,逐层计算即就是前向传播的过程。
2. 反向传播
(1)在前向传播阶段,网络依次计算每一层的输出。利用损失函数将网络最后一层的输出与目标值比较,得到损失值,将损失通过反向传播逐层传递直到第一层,反向传播结束之后更新所有层的连接权值。
3. Caffe最优化求解
求解器具有如下特性:
(1)记录优化过程,创建用于学习的训练网络和用于评估学习效果的测试网络。
(2)调用前向传播函数计算输出和损失,调用反向传播函数计算梯度值,根据求解器的方法将梯度转化为权值增量,依据学习率、历史权值和所用求解方法等信息更新求解器状态。
(3)周期性评测网络。在优化过程中为模型、求解器的状态记录快照。
Tips:
1. caffe中默认使用系统时钟生成随机数种子。这意味着得到两个相同的初始化是非常困难的。
2. caffe在训练过程中会保存有snapshot文件,当需要在某个状态下继续训练时可以使用该文件。只需要在train.sh中修改一下设置,将-weight=$.caffemodel修改为-snapshot=$.solverstate