【框架caffe】5:solver.hpp/solver.cpp
2018-09-13 本文已影响13人
yuanCruise
0.solver简介
Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行 训练了。
shared_ptr<Net<Dtype> > net_;
不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能.不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能。
最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时
候,实际上是在运行caffe.cpp中的train( )函数,而这个函数实际上是实
例化一个Solver对象,初始化后调用了Solver中的Solve( )方法。而这个
Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几
个函数。
主要方法:
Snapshot() 输出当前网络状态到一个文件中;
Restore() 从一个文件中读入网络状态,并可以从那个状态恢复;
GetLearningRate() 得到学习率;
PreSolve() 提前训练;
ComputeUpdateValue()用随机梯度下降法计算更新值,
1.solver.hpp
代码框架
Namespace caffe{class Solver{…}}
class SGDSolver : public Solver<Dtype>{…}
class NesterovSolver : public SGDSolver<Dtype>{…}
class AdaGradSolver : public SGDSolver<Dtype> {…}
Solver<Dtype>* GetSolver(const SolverParameter& param) {…}
包含头文件
#include "caffe/net.hpp“
成员函数
Solver() 构造函数,初始化两个net类,分别是net和test_net类,并调用init函数。
Init() 初始化网络
Snapshot() 输出当前网络状态到一个文件中;
Restore() 从一个文件中读入网络状态,并可以从那个状态恢复;
GetLearningRate() 得到学习率;
PreSolve() 提前训练,详见cpp;
ComputeUpdateValue() 用随机梯度下降法计算更新值,详见cpp;
- Solver训练网络步骤
1. 设置Caffe的mode(GPU还是CPU)
2. 如果是GPU且有GPU芯片的ID,则设置GPU
3. 设置当前阶段(TRAIN还是TEST/TRAIN)
4. 调用PreSolve函数:PreSolve()
5. 调用Restore函数:Restore(resume_file)
6. 调用一遍Test(),判断内存是否够
7. 对于每一次训练时的迭代(遍历整个网络)
----------------------------------------------------
对于每一次训练时的迭代(遍历整个网络):*
while (iter_++ < param_.max_iter())
1.计算loss:loss = net_->ForwardBackward(bottom_vec)
2.调用ComputeUpdateValue函数;
3.输出loss;
4. 达到test_interval时调用Test()
5. 达到snapshot时调用snapshot()
-----------------------------------------------------
Test() 测试网络。步骤:
1. 设置当前阶段(TRAIN还是TEST/TEST)
2. 将test_net_指向net_,即对同一个网络操作
3. 对于每一次测试时的迭代:for (int i = 0; i < param_.test_iter(); ++i)
3.1.用下面语句给result赋值net_output_blobs_
result = test_net_->Forward(bottom_vec, &iter_loss);
3.2.第一次测试时: 取每一个输出层的blob result_vec = result[j]->cpu_data(),把每一个blob的数据(降为一维)存入一个vector–“test_score”
不是第一次测试: 用 test_score[idx++] += result_vec[k] 而不是test_score.push_back(result_vec[k])
把输出层对应位置的blob值累加 test_score[idx++] += result_vec[k]。
3.3.是否要输出Test loss,是否要输出test_score;
3.4.设置当前阶段(TRAIN还是TEST/TRAIN)