(Caffe, Lenet 5) 훈련 네트워크 입구 (2)

6333 단어 C++caffeLeNet
본문 주소:http://blog.csdn.net/mounty_fsc/article/details/51090114
lenet 을 훈련 시 키 는 train_lenet.sh 내용 은:
./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt
이 를 통 해 알 수 있 듯 이 훈련 망 골 모형 은 tools/caffe.cpp 생 성 된 도구 caffe 가 모델 train 에서 완성 되 었 다.초기 화 과정 은 전체적으로 main(), train() 에서 Solver 만 들 고 Solver 에서 Net 만 들 고 Net 에서 Layer 만 듭 니 다.
1 프로그램 입구
  • 에서 찾 은 caffe.cpp 함수 중 main 을 통 해 실행 GetBrewFunction(caffe::string(argv[1]))() 함 수 를 호출 합 니 다.
  • train() 매개 변수 train 를 통 해 -examples/mnist/lenet_solver.prototxt 매개 변 수 를 읽 습 니 다 solver.
  • 그 다음 에 등록 하고 정의 solver_param 의 지침 (2 절 참조)
        shared_ptr<caffe::Solver<float> > 
    solver(caffe::SolverRegistry<float>::CreateSolver(solver_param))

  • 호출 solversolver 방법.여러 개의 GPU 가 GPU 간 비동기 처리 문제 와 관련 되 어 있 습 니 다 (3 절 참조)
     if (gpus.size() > 1) {
       caffe::P2PSync<float> sync(solver, NULL, solver->param());
       sync.run(gpus);
     } else {
       LOG(INFO) << "Starting Optimization";
       solver->Solve();
     }


  • 2 Solver 의 생 성
    1 에서 Solver() 의 지침 Solversolver 을 통 해 만 들 어 졌 고 SolverRegistry::CreateSolver 함수 에서 주의 할 점 은 CreateSolver 이다.
      // Get a solver using a SolverParameter.
      static Solver<Dtype>* CreateSolver(const SolverParameter& param) {
        const string& type = param.type();
        CreatorRegistry& registry = Registry();
        CHECK_EQ(registry.count(type), 1) << "Unknown solver type: " << type
            << " (known types: " << SolverTypeListString() << ")";
        return registry[type](param);
      }

    그 중:return registry[type](param) 은 하나의 registry 이 고 그 중에서 map<string,Creator>: typedef std::map<string, Creator> CreatorRegistry 는 함수 포인터 유형 입 니 다. Creator typedef Solver<Dtype>* (*Creator)(const SolverParameter&) 은 함수 포인터 변수 입 니 다. registry[type] 에서 구체 적 인 값 은 Lenet5 이 고 그 중에서 caffe::Creator_SGDSolver<float>(caffe::SolverParameter const&) 은 다음 매크로 에서 정의 합 니 다. Creator_SGDSolver 이 매크로 가 완전히 전 개 된 내용 은 다음 과 같 습 니 다.
    template <typename Dtype>                                                    \
      Solver<Dtype>* Creator_SGDSolver(                                       \
          const SolverParameter& param)                                            \
      {                                                                            \
        return new SGDSolver<Dtype>(param);                                     \
      }                                                                            \
      static SolverRegisterer<float> g_creator_f_SGD("SGD", Creator_SGDSolver<float>);    \
      static SolverRegisterer<double> g_creator_d_SGD("SGD", Creator_SGDSolver<double>)

    위 에서 보 듯 이 REGISTER_SOLVER_CLASS(SGD) 에서 registry[type](param) 밴드 구조 방법 을 실제로 호출 했 고 사실상 네트워크 는 SGDSolver 의 구조 방법 에서 초기 화 되 었 다.SGDSolver 의 정 의 는 다음 과 같다.
    template <typename Dtype>
    class SGDSolver : public Solver<Dtype> {
     public:
      explicit SGDSolver(const SolverParameter& param)
          : Solver<Dtype>(param) { PreSolve(); }
      explicit SGDSolver(const string& param_file)
          : Solver<Dtype>(param_file) { PreSolve(); }
    ......
    SGDSolver 계승 과 SGDSolver 따라서 Solver<Dtype>new SGDSolver<Dtype>(param) 의 구조 함 수 를 집행 한 다음 에 자신의 구조 함 수 를 호출 할 것 이다.전체 네트워크 테이프 초기 화 는 이 안에서 이 루어 집 니 다.
    3 Solver:: Solve () 함수

    좋은 웹페이지 즐겨찾기