caffe相关代码注释:https://github.com/QueenJuliaZxx/Caffe

1、求解器Solver

目的:让损失函数达到全局最小;

特性:

  • 负责记录优化过程,创建用于学习的训练网络和用于评估学习效果的测试网络;
  • 调用Forward-->调用Backword-->更新权值,反复迭代优化模型;
  • 周期性地评估测试网络;
  • 在优化过程中为模型、求解器状态打快照;

为了让权值从初始化状态向更好的模型前进,求解器在每次迭代中做了如下事情:

  • 调用Net的前向传播函数来计算输出和损失函数;
  • 调用Net的反向传播函数来计算梯度;
  • 根据求解器方法,将梯度转换为权值增量;
  • 根据学习速率、你是全职、所用方法更新求解器状态;

2、Solver的实现

权值层(卷积层和全连接层)需要学习,学习速率控制收敛(把握“度”),以此达到权值学习“不偏不倚”;
2.1、算法描述:
求解器种类:SGD、AdaDelta、自适应梯度法(ADAGRAD)、Adam、NAG、RMSprop
  • 学习速率(LR):负梯度的权重-->今天学了多少;
  • 遗忘因子(Momentum):权值更新历史Vt的权重-->以前学过的知识记得多少;
深度学习21天实战caffe学习笔记《12:Caffe 最优化求解过程》
深度学习21天实战caffe学习笔记《12:Caffe 最优化求解过程》深度学习21天实战caffe学习笔记《12:Caffe 最优化求解过程》

注:如果训练发散(损失函数值变得非常大,甚至出现NaN或Inf),试着减小base_lr,然后重新训练,直到不再发散。

深度学习21天实战caffe学习笔记《12:Caffe 最优化求解过程》

2.2、数据结构描述

(1).查看Solver描述信息;打开 caffe/src/proto/caffe.proto

(2).查看Solver类声明;打开 include/caffe/solver.hpp

(3).查看Solver类实现;打开 src/caffe/solvers/xx_solver.cpp

2.3、训练过程

求解器核心函数Solve()-->求解器迭代过程Step()-->SGDSolver中ApplyUpdate()实现...

2.4、预测过程

Solver里面test_nets_切换到新数据集进行预测,调用TestALL();

2.5、Solver的快照和恢复功能

求解器在Solver::Snapshot()和Solver::SnapshotSolverState()中将权值和训练时的状态打快照;

权值快照将学习到的模型导出,而求解器快照允许将特定快照点恢复训练,求解器在Solver::Restore ()和Solver::RestoreSolverState()恢复训练, 权值保存到*.caffemodel文件中,求解器保存到*.solverstate文件中,每个文件都有_iter_N后缀。

具体的实现还是得仔细看看相关文档!