1、概述
solver算是caffe中比较核心的一个概念,在我们训练train我们的网络时,就必须要带上这个参数,
如下例是我要对Lenet进行训练的时候要调用的程序,现在不知道什么意思没关系,只需要知道这个solver.prototxt是个必不可少的东西就ok
./build/tools/caffe train--solver=examples/mnist/lenet_solver.prototxt
Solver通过协调Net的前向推断计算和反向梯度计算对参数进行更新,从而达到减小loss的目的
Solver的主要功能:
○ 设计好需要优化的对象,创建train网络和test网络。(通过调用另外一个配置文件prototxt来进行)
○ 通过forward和backward迭代的进行优化来更新新参数。
○ 定期的评价测试网络。 (可设定多少次训练后,进行一次测试)。
○ 在优化过程中记录模型和solver的状态的快照。
在每一次的迭代过程中,solver做了这几步工作:
1、调用forward算法来计算最终的输出值,以及对应的loss
2、调用backward算法来计算每层的梯度
3、根据选用的slover方法,利用梯度进行参数更新
4、根据学习率、历史数据、求解方法更新solver状态,使得权重从初始化状态逐步更新到最终的状态。
2、caffe.proto关于solver的描述
虽然内容很多,但是基本上是注释占的篇幅多,而且我也基本上都翻译成了中文注释,建议仔细阅读,这是一切solver的模版
// NOTE
// Update the next available ID when you add a new SolverParameter field.
// ## 注意,如果你要增加一个新的sovler参数,需要给它更新ID,就是下面内容中的数字
// SolverParameter next available ID: 41 (last added: type) ##下一个可用的ID是41,上一次caffe增加的是type参数,就是下文中的40
message SolverParameter {
//////////////////////////////////////////////////////////////////////////////
// Specifying the train and test networks
// ##指定训练和测试网络
// Exactly one train net must be specified using one of the following fields:
// train_net_param, train_net, net_param, net
// One or more test nets may be specified using any of the following fields:
// test_net_param, test_net, net_param, net
// If more than one test net field is specified (e.g., both net and
// test_net are specified), they will be evaluated in the field order given
// above: (1) test_net_param, (2) test_net, (3) net_param/net.
// A test_iter must be specified for each test_net.
// A test_level and/or a test_stage may also be specified for each test_net.
//////////////////////////////////////////////////////////////////////////////
// Proto filename for the train net, possibly combined with one or more
// test nets. ##这个训练网络的Proto文件名,可能结合一个或多个测试网络。
optional string net = 24;
// Inline train net param, possibly combined with one or more test nets. ## 对应的训练网络的参数,可能结合一个或多个测试网络
optional NetParameter net_param = 25;
optional string train_net = 1; // Proto filename for the train net. ## train net的proto文件名
repeated string test_net = 2; // Proto filenames for the test nets. ## test nets的proto文件名
optional NetParameter train_net_param = 21; // Inline train net params. ## 与上面train网络一致对应的参数
repeated NetParameter test_net_param = 22; // Inline test net params. ## 与上面test网络一致对应的参数
// The states for the train/test nets. Must be unspecified or
// specified once per net.
// ## train/test网络的状态。 必须是未指定或每个网络指定一次
// By default, all states will have solver = true; ##默认情况下,所有状态都将有solver = true;
// train_state will have phase = TRAIN, ##train_state会有phase = TRAIN,
// and all test_state's will have phase = TEST. ##所有的t