从Caffe源码分析训练过程

Caffe库从大体上分为4大类,即Blob,Layer,Net,Solver。本文先从总体上概括Caffe源码的训练过程。

下面开始来具体进行介绍。

先从Caffe.cpp文件中的train()函数开始说起。

1、创建一个SolverParameter solver_param用来保存求解(优化)的一些参数,SolverParameter这个数据结构具体被定义在caffe.proto文件中。

2、Caffe::readProtoFromTextFileDie(“solver.proto”,&solver_param)//读取solver.proto中的求解参数,并将其保存在solver_param中。

3、设置Solver模式—设置GPU/CPU进行训练求解。

4、创建shared_ptr> solver(caffe::GetSolver(solver_param))对象,这里是一种简单工厂的设计模式,caffe::GetSolver(solver_param),根据solver_param参数的不同,创建不同的对象实例。在这里caffe默认创建一个SGD的对象实例,即SGD(SGD派生类)求解方式。

      在这里具体实现有: 

             1、调用Solver类构造函数,调用Init()函数;

             2、Init()函数中调用InitTrainNet(),这个函数创建训练网络Net,首先创建一个Net对象net_,这个net_对象会根据自己配置的网络结构文件创建不同类型的layer.  InitTestNet()与InitTrainNet()类似。

             3、调用PreSolve函数,这个函数功能是将参数push_back到history_,update_,temp_这三个vector中。

5、solver->Solve求解,主要是反复调用Net::ForwardBackward函数,因为误差来自于loss层,因此Net::ForwardBackward()只有一个参数。

Dtype Net::ForwardBackward(const vector* > & bottom) {
    Dtype loss;
    Forward(bottom, &loss);//误差来自于loss层
    Backward();
    return loss;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Net::Forward函数函数,调用Net::ForwardPrefilled(), Net::ForwardPrefilled()调用Net::ForwardFromTo—这个函数将调用layers::Forward函数,因为在Net创建时,layers_对象就保存了每一层类型,因此每一个layers_[i]调用属于它自己类型的Forward和Backward函数(虚函数,多态)。

第一次写博客,首先先把caffe的整体训练的过程理清楚,接下来将写blob,layers,net,solver的具体实现啦。

你可能感兴趣的:(深度学习)