caffe源码解析-/tools/caffe.cpp(caffe程序入口)

见代码及其注释(ps::个人理解,如有误,欢迎指正)

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifdef WITH_PYTHON_LAYER</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "boost/python.hpp"</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> bp = boost::python;
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <gflags/gflags.h></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <glog/logging.h></span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <cstring></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <map></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <string></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <vector></span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "boost/algorithm/string.hpp"</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "caffe/caffe.hpp"</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include "caffe/util/signal_handler.h"</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Blob;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Caffe;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Net;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Layer;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Solver;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::Timer;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">using</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ostringstream</span>;


<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*gflags是google的一个开源的处理命令行参数的库。
  在使用命令行参数的文件文件中(源文件或头文件),首先使用一下定义语句进行变量的定义。
  DEFINE_int32,DEFINE_int64,DEFINE_bool,DEFINE_double,DEFINE_string等,
  语法为:DEFINE_int32(name, default_value, "description")。
  接着你就可以使用FLAGS_name变量了,这些变量的值则是由命令行参数传递,无则为默认值,
  在其他代码文件中若想用该命令参数,可以用DECLARE_int32(name)声明(name为int32类型,也可以使用其他支持的类型)。
  在caffe.cpp中有很多FLAGS_name定义,如DEFINE_string(gpu,"","some description"),则命令行后-gpu 0,表示FLAGS_gpu=0,默认值为空。*/</span>
DEFINE_string(gpu, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; run in GPU mode on given device IDs separated by ','."</span>
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use '-gpu all' to run on all available GPUs. The effective training "</span>
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"batch size is multiplied by the number of devices."</span>);
DEFINE_string(solver, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The solver definition protocol buffer text file."</span>);
DEFINE_string(model, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The model definition protocol buffer text file."</span>);
DEFINE_string(phase, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; network phase (TRAIN or TEST). Only used for 'time'."</span>);
DEFINE_int32(level, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; network level."</span>);
DEFINE_string(stage, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; network stages (not to be confused with phase), "</span>
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"separated by ','."</span>);
DEFINE_string(snapshot, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; the snapshot solver state to resume training."</span>);
DEFINE_string(weights, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; the pretrained weights to initialize finetuning, "</span>
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"separated by ','. Cannot be set simultaneously with snapshot."</span>);
DEFINE_int32(iterations, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span>,
    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"The number of iterations to run."</span>);
DEFINE_string(sigint_effect, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"stop"</span>,
             <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; action to take when a SIGINT signal is received: "</span>
              <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snapshot, stop or none."</span>);
DEFINE_string(sighup_effect, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snapshot"</span>,
             <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optional; action to take when a SIGHUP signal is received: "</span>
             <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snapshot, stop or none."</span>);

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// A simple registry for caffe commands.</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">typedef</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> (*BrewFunction)();  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*声明了一个BrewFunction函数指针类型,可以用它来定义一个函数指针*/</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">typedef</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span><caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>, BrewFunction></span> BrewMap;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*因为输入参数可能为train,test,device_query,time,所以定义一个容器类型*/</span>
BrewMap g_brew_map;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*定义在上午key为string的map容器实例*/</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里巧妙的用宏定义的方式声明了分别包含train(),test(),
   device_query(),time()四个函数的四个不同类*/</span>
   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*理解这个关键理解宏在预编译阶段是如何被展开*/</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#define RegisterBrewFunction(func) \</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">namespace</span> { \
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> __Registerer_<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##func { \</span>
 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* NOLINT */</span> \
  __Registerer_<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##func() { \</span>
    g_brew_map[<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#func] = &func; \</span>
  } \
}; \
__Registerer_<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##func g_registerer_##func; \</span>
}
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//在C/C++的宏中,"#"的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。  </span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//”##”被称为连接符(concatenator),用来将两个子串Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。 </span>




<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*在caffe.cpp 中 BrewFunction 作为GetBrewFunction()函数的返回类型,
  可以是 train(),test(),device_query(),time() 这四个函数指针的其中一个。
  在train(),test(),中可以调用solver类的函数,从而进入到net,进入到每一层,运行整个caffe程序。*/</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> BrewFunction GetBrewFunction(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& name) {
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (g_brew_map.count(name)) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判断输入的是不是g_brew_map中train,test,device_query,time中一个</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> g_brew_map[name];     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果是的话,就调用相应的train(),test(),device_query(),time()</span>
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    LOG(ERROR) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Available caffe actions:"</span>; 
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (BrewMap::iterator it = g_brew_map.begin();
         it != g_brew_map.end(); ++it) {
      LOG(ERROR) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\t"</span> << it->first;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//LOG来源于google的glog库,控制程序的日志输出消息和测试消息 </span>
    }
    LOG(FATAL) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Unknown action: "</span> << name;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> NULL;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// not reachable, just to suppress old compiler warnings.</span>
  }
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Parse GPU ids or use all available devices</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//解析可用GPU,使用所有可用硬件  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> get_gpus(<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span>* gpus) {
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_gpu == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"all"</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> count = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef CPU_ONLY</span>
    CUDA_CHECK(cudaGetDeviceCount(&count));
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#else</span>
    NO_GPU;
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < count; ++i) {
      gpus->push_back(i);
    }
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_gpu.size()) {
    <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> strings;
    boost::split(strings, FLAGS_gpu, boost::is_any_of(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">","</span>));
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < strings.size(); ++i) {
      gpus->push_back(boost::lexical_cast<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>>(strings[i]));
    }
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    CHECK_EQ(gpus->size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
  }
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Parse phase from flags</span>
caffe::Phase get_phase_from_flags(caffe::Phase default_value) {
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_phase == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> default_value;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_phase == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"TRAIN"</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::TRAIN;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_phase == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"TEST"</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::TEST;
  LOG(FATAL) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"phase must be \"TRAIN\" or \"TEST\""</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::TRAIN;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Avoid warning</span>
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Parse stages from flags</span>
<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> get_stages_from_flags() {
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> stages;
  boost::split(stages, FLAGS_stage, boost::is_any_of(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">","</span>));
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> stages;
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// caffe commands to call by</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//     caffe <command> <args></span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// To add a command, define a function "int command()" and register it with</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// RegisterBrewFunction(action);</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Device Query: show diagnostic information for a GPU device.</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> device_query() {     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里定义device_query函数*/</span>
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Querying GPUs "</span> << FLAGS_gpu;
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> gpus;
  get_gpus(&gpus);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*获得有几个GPU*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < gpus.size(); ++i) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*依次查询每个GPU信息*/</span>
    caffe::Caffe::SetDevice(gpus[i]);
    caffe::Caffe::DeviceQuery();
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}
RegisterBrewFunction(device_query); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里通过预编译阶段的宏替换,将定义的device_query函数指针赋值到map容器中*/</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*加载训练的或者传入的模型*/</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Load the weights from the specified caffemodel(s) into the train and</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// test nets.</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> CopyLayers(caffe::Solver<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>>* solver, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& model_list) {
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> model_names;
  boost::split(model_names, model_list, boost::is_any_of(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">","</span>) );
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < model_names.size(); ++i) {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Finetuning from "</span> << model_names[i];
    solver->net()->CopyTrainedLayersFrom(model_names[i]);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < solver->test_nets().size(); ++j) {
      solver->test_nets()[j]->CopyTrainedLayersFrom(model_names[i]);
    }
  }
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//将交互端传来的string类型的标志转成枚举类型的变量</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Translate the signal effect the user specified on the command-line to the</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// corresponding enumeration.</span>
caffe::SolverAction::Enum GetRequestedAction(
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& flag_value) {
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (flag_value == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"stop"</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::SolverAction::STOP;
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (flag_value == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snapshot"</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::SolverAction::SNAPSHOT;
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (flag_value == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"none"</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> caffe::SolverAction::NONE;
  }
  LOG(FATAL) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Invalid signal effect \""</span><< flag_value << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\" was specified"</span>;
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Train / Finetune a model.</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*训练或者微调网络都是走这个分支*/</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> train() {   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*定义train函数*/</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// google的glog库,检查--solver、--snapshot和--weight并输出消息;必须有指定solver,并且snapshot和weight两者只需指定其一;  </span>
  CHECK_GT(FLAGS_solver.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Need a solver definition to train."</span>;
  CHECK(!FLAGS_snapshot.size() || !FLAGS_weights.size())
      << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Give a snapshot to resume training or weights to finetune "</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"but not both."</span>;
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> stages = get_stages_from_flags();

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*SolverParameter是通过Google Protocol Buffer自动生成的一个类*/</span>
  caffe::SolverParameter solver_param;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*定义SolverParameter的对象,该类保存solver参数和相应的方法*/</span>
  caffe::ReadSolverParamsFromTextFileOrDie(FLAGS_solver, &solver_param);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//将-solver指定solver.prototxt文件内容解析到solver_param中  </span>

  solver_param.mutable_train_state()->set_level(FLAGS_level);
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < stages.size(); i++) {
    solver_param.mutable_train_state()->add_stage(stages[i]);
  }

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// If the gpus flag is not provided, allow the mode and device to be set</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// in the solver prototxt.</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_gpu.size() == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//根据命令参数-gpu或者solver.prototxt提供的信息设置GPU</span>
      && solver_param.solver_mode() == caffe::SolverParameter_SolverMode_GPU) {
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (solver_param.has_device_id()) {
          FLAGS_gpu = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span> +
              boost::lexical_cast<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>>(solver_param.device_id());
      } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Set default GPU if unspecified</span>
          FLAGS_gpu = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span> + boost::lexical_cast<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//boost::lexical_cast(0)是将数值0转换为字符串'“0”;</span>
      }
  }
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*上述代码:::: 首先是判断用户在Command Line中是否输入了gpu相关的参数,
                 如果没有(FLAGS_gpu.size()==0)但是用户在solver的prototxt定义中提供了相关的参数,
                 那就把相关的参数放到FLAGS_gpu中,如果用户仅仅是选择了在solver的prototxt定义中选择了GPU模式,
                 但是没有指明具体的gpu_id,那么就默认设置为0。*/</span>


  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//多GPU下,将GPU编号存入vector容器中(get_gpus()函数通过FLAGS_gpu获取)</span>
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> gpus;
  get_gpus(&gpus);
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gpus.size() == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use CPU."</span>;
    Caffe::set_mode(Caffe::CPU);
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ostringstream</span> s;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < gpus.size(); ++i) {
      s << (i ? <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span> : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>) << gpus[i];
    }
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Using GPUs "</span> << s.str();
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef CPU_ONLY</span>
    cudaDeviceProp device_prop;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < gpus.size(); ++i) {
      cudaGetDeviceProperties(&device_prop, gpus[i]);
      LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"GPU "</span> << gpus[i] << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">": "</span> << device_prop.name;
    }
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>
    solver_param.set_device_id(gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
    Caffe::SetDevice(gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
    Caffe::set_mode(Caffe::GPU);
    Caffe::set_solver_count(gpus.size());
  }

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//处理snapshot, stop or none信号,其声明在include/caffe/util/signal_Handler.h中;</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//GetRequestedAction在caffe.cpp中,将‘stop’,‘snapshot’,‘none’转换为标准信号,即解析;</span>
  caffe::SignalHandler signal_handler(
        GetRequestedAction(FLAGS_sigint_effect),
        GetRequestedAction(FLAGS_sighup_effect));

   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//声明boost库中智能指针solver,指向caffe::Solver对象,该对象由CreateSolver创建,后续细讲;</span>
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><caffe::Solver<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>> >
      solver(caffe::SolverRegistry<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>>::CreateSolver(solver_param));   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里初始化网络*/</span>

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*通过GetActionFunction来处理获得的系统信号*/</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*在SetActionFunction中将GetActionFunction函数地址传给参数action_request_function_*/</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*在网络训练的过程中,在GetRequestedAction中来处理action_request_function_得到的函数指针*/</span>
  solver->SetActionFunction(signal_handler.GetActionFunction());

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判断了一下用户是否定义了snapshot或者weights这两个参数中的一个</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果定义了则需要通过Solver提供的接口从snapshot或者weights文件</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//中去读取已经训练好的网络的参数,来接着训练</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_snapshot.size()) {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Resuming from "</span> << FLAGS_snapshot;
    solver->Restore(FLAGS_snapshot.c_str());
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (FLAGS_weights.size()) {
    CopyLayers(solver.get(), FLAGS_weights);
  }

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*对于多个GPU方式,用线程并行优化网络*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gpus.size() > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
    caffe::P2PSync<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>> sync(solver, NULL, solver->param());
    sync.Run(gpus);
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Starting Optimization"</span>;
    solver->Solve();  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//开始优化网络</span>
  }
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Optimization Done."</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}
RegisterBrewFunction(train);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*将train函数指针,指到map容器中*/</span>


<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Test: score a model.</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> test() {  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*定义测试函数*/</span>
  CHECK_GT(FLAGS_model.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Need a model definition to score."</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*判断是否传入网络*/</span>
  CHECK_GT(FLAGS_weights.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Need model weights to score."</span>;    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*判断是否传入模型*/</span>
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> stages = get_stages_from_flags();

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Set device id and mode</span>
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> gpus;
  get_gpus(&gpus);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*获得GPU信息*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gpus.size() != <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use GPU with device ID "</span> << gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifndef CPU_ONLY  /*如果没只用CPU那么就要获得GPU信息*/</span>
    cudaDeviceProp device_prop;
    cudaGetDeviceProperties(&device_prop, gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"GPU device name: "</span> << device_prop.name;
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>
    Caffe::SetDevice(gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
    Caffe::set_mode(Caffe::GPU);
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*如果没有GPU就在CPU上处理*/</span>
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use CPU."</span>;
    Caffe::set_mode(Caffe::CPU);
  }
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Instantiate the caffe net.</span>
  Net<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>> caffe_net(FLAGS_model, caffe::TEST, FLAGS_level, &stages);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*创建一个网络对象*/</span>
  caffe_net.CopyTrainedLayersFrom(FLAGS_weights);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*加载模型*/</span>  
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Running for "</span> << FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" iterations."</span>;

  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> test_score_output_id;
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>></span> test_score;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> loss = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < FLAGS_iterations; ++i) {  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*FLAGS_iterations:::传入的迭代次数*/</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> iter_loss;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><Blob<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>></span>*>& result =
        caffe_net.Forward(&iter_loss);     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*按网络做前身传播*/</span>
    loss += iter_loss;                     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*累加每次的损失量*/</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> idx = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < result.size(); ++j) {    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*打印每次迭代的accuracy与loss信息*/</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>* result_vec = result[j]->cpu_data();
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; k < result[j]->count(); ++k, ++idx) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> score = result_vec[k];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (i == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
          test_score.push_back(score);
          test_score_output_id.push_back(j);
        } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
          test_score[idx] += score;
        }
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& output_name = caffe_net.blob_names()[
            caffe_net.output_blob_indices()[j]];
        LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Batch "</span> << i << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span> << output_name << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" = "</span> << score;
      }
    }
  }
  loss /= FLAGS_iterations;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Loss: "</span> << loss;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*打印测试的结果总的平均的accuracy与loss信息*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < test_score.size(); ++i) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& output_name = caffe_net.blob_names()[
        caffe_net.output_blob_indices()[test_score_output_id[i]]];
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> loss_weight = caffe_net.blob_loss_weights()[
        caffe_net.output_blob_indices()[test_score_output_id[i]]];
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ostringstream</span> loss_msg_stream;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> mean_score = test_score[i] / FLAGS_iterations;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (loss_weight) {
      loss_msg_stream << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" (* "</span> << loss_weight
                      << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" = "</span> << loss_weight * mean_score << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" loss)"</span>;
    }
    LOG(INFO) << output_name << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" = "</span> << mean_score << loss_msg_stream.str();
  }

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}
RegisterBrewFunction(test); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*将test函数指针,指到map容器中*/</span>


<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Time: benchmark the execution time of a model.</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> time() {   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*定义测试性能函数*/</span>
  CHECK_GT(FLAGS_model.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Need a model definition to time."</span>;
  caffe::Phase phase = get_phase_from_flags(caffe::TRAIN);
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>></span> stages = get_stages_from_flags();

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Set device id and mode</span>
  <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>></span> gpus;
  get_gpus(&gpus);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*读取GPU信息*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (gpus.size() != <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*如果有就用GPU*/</span>
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use GPU with device ID "</span> << gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];
    Caffe::SetDevice(gpus[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
    Caffe::set_mode(Caffe::GPU);
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Use CPU."</span>;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*如果没有就只用CPU*/</span>
    Caffe::set_mode(Caffe::CPU);
  }
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Instantiate the caffe net.</span>
  Net<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>> caffe_net(FLAGS_model, phase, FLAGS_level, &stages);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*根据传入的参数创建网络的对象*/</span>

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Do a clean forward and backward pass, so that memory allocation are done</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// and future iterations will be more stable.</span>
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Performing Forward"</span>;
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Note that for the speed benchmark, we will assume that the network does</span>
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// not take any input blobs.</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> initial_loss;
  caffe_net.Forward(&initial_loss);   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*前向传播执行一遍*/</span> 
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Initial loss: "</span> << initial_loss;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Performing Backward"</span>;
  caffe_net.Backward();               <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*后向传播执行一遍*/</span>

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shared_ptr</span><Layer<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>></span> > >& layers = caffe_net.layers();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><Blob<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>></span>*></span> >& bottom_vecs = caffe_net.bottom_vecs();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><Blob<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span>></span>*></span> >& top_vecs = caffe_net.top_vecs();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span>></span> ></span>& bottom_need_backward =
      caffe_net.bottom_need_backward();
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"*** Benchmark begins ***"</span>;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Testing for "</span> << FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" iterations."</span>;
  Timer total_timer;
  total_timer.Start();
  Timer forward_timer;
  Timer backward_timer;
  Timer timer;
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span>></span> forward_time_per_layer(layers.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span>);
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span>></span> backward_time_per_layer(layers.size(), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span>);
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span> forward_time = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span> backward_time = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < FLAGS_iterations; ++j) {
    Timer iter_timer;
    iter_timer.Start();
    forward_timer.Start();
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < layers.size(); ++i) {
      timer.Start();
      layers[i]->Forward(bottom_vecs[i], top_vecs[i]);
      forward_time_per_layer[i] += timer.MicroSeconds();   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*统计前向传播每层所需的时间*/</span>
    }
    forward_time += forward_timer.MicroSeconds();
    backward_timer.Start();
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = layers.size() - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i >= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; --i) {
      timer.Start();
      layers[i]->Backward(top_vecs[i], bottom_need_backward[i],
                          bottom_vecs[i]);
      backward_time_per_layer[i] += timer.MicroSeconds();    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*统计后向传播每层所需的时间*/</span>
    }
    backward_time += backward_timer.MicroSeconds();
    LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Iteration: "</span> << j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" forward-backward time: "</span>
      << iter_timer.MilliSeconds() << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  }
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Average time per layer: "</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < layers.size(); ++i) {    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里统计每层的平均耗时并打印*/</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>& layername = layers[i]->layer_param().name();
    LOG(INFO) << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::setfill(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' '</span>) << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::setw(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>) << layername <<
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\tforward: "</span> << forward_time_per_layer[i] / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span> /
      FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
    LOG(INFO) << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::setfill(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' '</span>) << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::setw(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>) << layername  <<
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\tbackward: "</span> << backward_time_per_layer[i] / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span> /
      FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  }
  total_timer.Stop();     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*统计总的前向传播与后向传播的平均耗时并打印*/</span>
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Average Forward pass: "</span> << forward_time / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span> /
    FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Average Backward pass: "</span> << backward_time / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span> /
    FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Average Forward-Backward: "</span> << total_timer.MilliSeconds() /
    FLAGS_iterations << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Total Time: "</span> << total_timer.MilliSeconds() << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" ms."</span>;
  LOG(INFO) << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"*** Benchmark ends ***"</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}
RegisterBrewFunction(time);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*将time函数指针,指到map容器中*/</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> argc, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>** argv) {
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Print output to stderr (while still logging).</span>
  FLAGS_alsologtostderr = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Set version</span>
  gflags::SetVersionString(AS_STRING(CAFFE_VERSION));
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Usage message.</span>
  gflags::SetUsageMessage(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"command line brew\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"usage: caffe <command> <args>\n\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"commands:\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"  train           train or finetune a model\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"  test            score a model\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"  device_query    show GPU diagnostic information\n"</span>
      <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"  time            benchmark model execution time"</span>);
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Run tool or show usage.</span>
  caffe::GlobalInit(&argc, &argv);  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*解析传入的Google Flags*/</span>
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (argc == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>) {
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifdef WITH_PYTHON_LAYER</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif  /*传入train,test,device_query,time命令时,进入这个分支调用这个函数*/</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> GetBrewFunction(caffe::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span>(argv[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]))();  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*argv[1]就是传入的参数train/test/device_query,time*/</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifdef WITH_PYTHON_LAYER</span>
    } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (bp::error_already_set) {
      PyErr_Print();
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
    }
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>
  } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
    gflags::ShowUsageWithFlagsRestrict(argv[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>], <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tools/caffe"</span>);
  }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li><li style="box-sizing: border-box; padding: 0px 5px;">351</li><li style="box-sizing: border-box; padding: 0px 5px;">352</li><li style="box-sizing: border-box; padding: 0px 5px;">353</li><li style="box-sizing: border-box; padding: 0px 5px;">354</li><li style="box-sizing: border-box; padding: 0px 5px;">355</li><li style="box-sizing: border-box; padding: 0px 5px;">356</li><li style="box-sizing: border-box; padding: 0px 5px;">357</li><li style="box-sizing: border-box; padding: 0px 5px;">358</li><li style="box-sizing: border-box; padding: 0px 5px;">359</li><li style="box-sizing: border-box; padding: 0px 5px;">360</li><li style="box-sizing: border-box; padding: 0px 5px;">361</li><li style="box-sizing: border-box; padding: 0px 5px;">362</li><li style="box-sizing: border-box; padding: 0px 5px;">363</li><li style="box-sizing: border-box; padding: 0px 5px;">364</li><li style="box-sizing: border-box; padding: 0px 5px;">365</li><li style="box-sizing: border-box; padding: 0px 5px;">366</li><li style="box-sizing: border-box; padding: 0px 5px;">367</li><li style="box-sizing: border-box; padding: 0px 5px;">368</li><li style="box-sizing: border-box; padding: 0px 5px;">369</li><li style="box-sizing: border-box; padding: 0px 5px;">370</li><li style="box-sizing: border-box; padding: 0px 5px;">371</li><li style="box-sizing: border-box; padding: 0px 5px;">372</li><li style="box-sizing: border-box; padding: 0px 5px;">373</li><li style="box-sizing: border-box; padding: 0px 5px;">374</li><li style="box-sizing: border-box; padding: 0px 5px;">375</li><li style="box-sizing: border-box; padding: 0px 5px;">376</li><li style="box-sizing: border-box; padding: 0px 5px;">377</li><li style="box-sizing: border-box; padding: 0px 5px;">378</li><li style="box-sizing: border-box; padding: 0px 5px;">379</li><li style="box-sizing: border-box; padding: 0px 5px;">380</li><li style="box-sizing: border-box; padding: 0px 5px;">381</li><li style="box-sizing: border-box; padding: 0px 5px;">382</li><li style="box-sizing: border-box; padding: 0px 5px;">383</li><li style="box-sizing: border-box; padding: 0px 5px;">384</li><li style="box-sizing: border-box; padding: 0px 5px;">385</li><li style="box-sizing: border-box; padding: 0px 5px;">386</li><li style="box-sizing: border-box; padding: 0px 5px;">387</li><li style="box-sizing: border-box; padding: 0px 5px;">388</li><li style="box-sizing: border-box; padding: 0px 5px;">389</li><li style="box-sizing: border-box; padding: 0px 5px;">390</li><li style="box-sizing: border-box; padding: 0px 5px;">391</li><li style="box-sizing: border-box; padding: 0px 5px;">392</li><li style="box-sizing: border-box; padding: 0px 5px;">393</li><li style="box-sizing: border-box; padding: 0px 5px;">394</li><li style="box-sizing: border-box; padding: 0px 5px;">395</li><li style="box-sizing: border-box; padding: 0px 5px;">396</li><li style="box-sizing: border-box; padding: 0px 5px;">397</li><li style="box-sizing: border-box; padding: 0px 5px;">398</li><li style="box-sizing: border-box; padding: 0px 5px;">399</li><li style="box-sizing: border-box; padding: 0px 5px;">400</li><li style="box-sizing: border-box; padding: 0px 5px;">401</li><li style="box-sizing: border-box; padding: 0px 5px;">402</li><li style="box-sizing: border-box; padding: 0px 5px;">403</li><li style="box-sizing: border-box; padding: 0px 5px;">404</li><li style="box-sizing: border-box; padding: 0px 5px;">405</li><li style="box-sizing: border-box; padding: 0px 5px;">406</li><li style="box-sizing: border-box; padding: 0px 5px;">407</li><li style="box-sizing: border-box; padding: 0px 5px;">408</li><li style="box-sizing: border-box; padding: 0px 5px;">409</li><li style="box-sizing: border-box; padding: 0px 5px;">410</li><li style="box-sizing: border-box; padding: 0px 5px;">411</li><li style="box-sizing: border-box; padding: 0px 5px;">412</li><li style="box-sizing: border-box; padding: 0px 5px;">413</li><li style="box-sizing: border-box; padding: 0px 5px;">414</li><li style="box-sizing: border-box; padding: 0px 5px;">415</li><li style="box-sizing: border-box; padding: 0px 5px;">416</li><li style="box-sizing: border-box; padding: 0px 5px;">417</li><li style="box-sizing: border-box; padding: 0px 5px;">418</li><li style="box-sizing: border-box; padding: 0px 5px;">419</li><li style="box-sizing: border-box; padding: 0px 5px;">420</li><li style="box-sizing: border-box; padding: 0px 5px;">421</li><li style="box-sizing: border-box; padding: 0px 5px;">422</li><li style="box-sizing: border-box; padding: 0px 5px;">423</li><li style="box-sizing: border-box; padding: 0px 5px;">424</li><li style="box-sizing: border-box; padding: 0px 5px;">425</li><li style="box-sizing: border-box; padding: 0px 5px;">426</li><li style="box-sizing: border-box; padding: 0px 5px;">427</li><li style="box-sizing: border-box; padding: 0px 5px;">428</li><li style="box-sizing: border-box; padding: 0px 5px;">429</li><li style="box-sizing: border-box; padding: 0px 5px;">430</li><li style="box-sizing: border-box; padding: 0px 5px;">431</li><li style="box-sizing: border-box; padding: 0px 5px;">432</li><li style="box-sizing: border-box; padding: 0px 5px;">433</li><li style="box-sizing: border-box; padding: 0px 5px;">434</li><li style="box-sizing: border-box; padding: 0px 5px;">435</li><li style="box-sizing: border-box; padding: 0px 5px;">436</li><li style="box-sizing: border-box; padding: 0px 5px;">437</li><li style="box-sizing: border-box; padding: 0px 5px;">438</li><li style="box-sizing: border-box; padding: 0px 5px;">439</li><li style="box-sizing: border-box; padding: 0px 5px;">440</li><li style="box-sizing: border-box; padding: 0px 5px;">441</li><li style="box-sizing: border-box; padding: 0px 5px;">442</li><li style="box-sizing: border-box; padding: 0px 5px;">443</li><li style="box-sizing: border-box; padding: 0px 5px;">444</li><li style="box-sizing: border-box; padding: 0px 5px;">445</li><li style="box-sizing: border-box; padding: 0px 5px;">446</li><li style="box-sizing: border-box; padding: 0px 5px;">447</li><li style="box-sizing: border-box; padding: 0px 5px;">448</li><li style="box-sizing: border-box; padding: 0px 5px;">449</li><li style="box-sizing: border-box; padding: 0px 5px;">450</li><li style="box-sizing: border-box; padding: 0px 5px;">451</li><li style="box-sizing: border-box; padding: 0px 5px;">452</li><li style="box-sizing: border-box; padding: 0px 5px;">453</li><li style="box-sizing: border-box; padding: 0px 5px;">454</li><li style="box-sizing: border-box; padding: 0px 5px;">455</li><li style="box-sizing: border-box; padding: 0px 5px;">456</li><li style="box-sizing: border-box; padding: 0px 5px;">457</li><li style="box-sizing: border-box; padding: 0px 5px;">458</li><li style="box-sizing: border-box; padding: 0px 5px;">459</li><li style="box-sizing: border-box; padding: 0px 5px;">460</li><li style="box-sizing: border-box; padding: 0px 5px;">461</li><li style="box-sizing: border-box; padding: 0px 5px;">462</li><li style="box-sizing: border-box; padding: 0px 5px;">463</li><li style="box-sizing: border-box; padding: 0px 5px;">464</li><li style="box-sizing: border-box; padding: 0px 5px;">465</li><li style="box-sizing: border-box; padding: 0px 5px;">466</li><li style="box-sizing: border-box; padding: 0px 5px;">467</li><li style="box-sizing: border-box; padding: 0px 5px;">468</li><li style="box-sizing: border-box; padding: 0px 5px;">469</li><li style="box-sizing: border-box; padding: 0px 5px;">470</li><li style="box-sizing: border-box; padding: 0px 5px;">471</li><li style="box-sizing: border-box; padding: 0px 5px;">472</li><li style="box-sizing: border-box; padding: 0px 5px;">473</li><li style="box-sizing: border-box; padding: 0px 5px;">474</li><li style="box-sizing: border-box; padding: 0px 5px;">475</li><li style="box-sizing: border-box; padding: 0px 5px;">476</li><li style="box-sizing: border-box; padding: 0px 5px;">477</li><li style="box-sizing: border-box; padding: 0px 5px;">478</li><li style="box-sizing: border-box; padding: 0px 5px;">479</li><li style="box-sizing: border-box; padding: 0px 5px;">480</li><li style="box-sizing: border-box; padding: 0px 5px;">481</li><li style="box-sizing: border-box; padding: 0px 5px;">482</li><li style="box-sizing: border-box; padding: 0px 5px;">483</li><li style="box-sizing: border-box; padding: 0px 5px;">484</li><li style="box-sizing: border-box; padding: 0px 5px;">485</li><li style="box-sizing: border-box; padding: 0px 5px;">486</li><li style="box-sizing: border-box; padding: 0px 5px;">487</li><li style="box-sizing: border-box; padding: 0px 5px;">488</li><li style="box-sizing: border-box; padding: 0px 5px;">489</li><li style="box-sizing: border-box; padding: 0px 5px;">490</li><li style="box-sizing: border-box; padding: 0px 5px;">491</li><li style="box-sizing: border-box; padding: 0px 5px;">492</li><li style="box-sizing: border-box; padding: 0px 5px;">493</li><li style="box-sizing: border-box; padding: 0px 5px;">494</li></ul>

感谢:::: 
http://blog.sina.com.cn/s/blog_9a3e0f110102w9r1.html 
http://blog.csdn.net/u011070171/article/details/51909608 
http://blog.csdn.net/u011070171/article/details/51909608

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值