天天看点

Caffe:深入分析(怎么训练)

  首先入口函数caffe.cpp

  在main函数中GetBrewFunction函数调用了通过工厂模式生成的由string到函数指针的map

  在train、test、device_query、time函数后面都可以看到对这些函数的register,相当于这些函数指针已经在map中存在了

  接着是train过程

  看CreateSolver函数是如何构建solver和net的,CreateSolver定义在solver_factory.hpp中,首先需要知道的是solver是一个基类,继承自它的类有SGD等,下面的实现就可以根据param的type构造一个指向特定solver的指针,比如SGD。

  关键之处在于上面代码最后一行语句,它的作用是根据配置文件创建对应的Solver对象(默认为SGDSolver子类对象)。此处工厂模式和一个关键的宏REGISTER_SOLVER_CLASS(SGD)发挥了重要作用。

  这样一个SGDSolver对象就调用其构造函数被构造出来了。

  同时,Solver这个基类也被构造出来了,在solver.hpp里

  caffe是如何来solve的:在成员函数Solve()内部,

  这就是整个网络的训练过程。 

当神已无能为力,那便是魔渡众生