首先入口函数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()内部,
这就是整个网络的训练过程。
当神已无能为力,那便是魔渡众生