美文网首页
Caffe源码分析—phase/level/stage理解

Caffe源码分析—phase/level/stage理解

作者: 陈泽_06aa | 来源:发表于2020-04-22 14:47 被阅读0次

    在caffe中,train.prototxt 、test.prototxt和 deploy.prototxt中间为了增加网络结构(.prototxt)文件的灵活性,可以通过设置phase、stage、level参数实现train、test、deploy文件统一合并在一个.prototxt文件中(通常见到的train_test合并为一个文件或分开为两个文件就是使用了这些参数)。

    1. 对于一个prototxt文件,可以在NetParameter层面,通过state字段来表示当前proto文件的phase/level/stage信息。
    message NetParameter {
    ...
      // The current "state" of the network, including the phase, level, and stage.
      // Some layers may be included/excluded depending on this state and the states
      // specified in the layers' include and exclude fields.
      optional NetState state = 6;
    ...
      // The layers that make up the net.  
      repeated LayerParameter layer = 100;  
    }
    message NetState {
      optional Phase phase = 1 [default = TEST];
      optional int32 level = 2 [default = 0];
      repeated string stage = 3;
    }
    

    其中phase指定当前Proto文件运行所在阶段,level要求Layer级别以及stage过滤。通过这三个字段可以选择或过滤掉相关的Layer。

    1. 对于每一个layer,定义了两个NetStateRule类型的字段,分别是include和exclude,来控制该Layer在Netstat处于何种状态下存在。
    message LayerParameter {
      // Rules controlling whether and when a layer is included in the network,
      // based on the current NetState.  You may specify a non-zero number of rules
      // to include OR exclude, but not both.  If no include or exclude rules are
      // specified, the layer is always included.  If the current NetState meets
      // ANY (i.e., one or more) of the specified rules, the layer is
      // included/excluded.
      repeated NetStateRule include = 8;
      repeated NetStateRule exclude = 9;
    }
    message NetStateRule {
      // Set phase to require the NetState have a particular phase (TRAIN or TEST)
      // to meet this rule.
      optional Phase phase = 1;
    
      // Set the minimum and/or maximum levels in which the layer should be used.
      // Leave undefined to meet the rule regardless of level.
      optional int32 min_level = 2;
      optional int32 max_level = 3;
    
      // Customizable sets of stages to include or exclude.
      // The net must have ALL of the specified stages and NONE of the specified
      // "not_stage"s to meet the rule.
      // (Use multiple NetStateRules to specify conjunctions of stages.)
      repeated string stage = 4;
      repeated string not_stage = 5;
    }
    
    1. NetParameter除了作为Net内部配置以外,与直接作为SolverParameter的字段来影响slover过程。SolverParameter定义还是比较复杂,但是整体目标是从SolverParameter中创建出唯一训练网络以及多个测试网络。
    • SolverParameter中通过net, net_param, train_net, train_net_param四个字段来指定训练网络,但是只允许同时出现一个。其中net,train_net为Net文件,而net_param, train_net_param为内联的网络配置,其实本质上没有太大区别,读取到内存以后,都是NetParameter。
    • SolverParameter中通过net, net_param, test_net, test_net_param四个字段来指定测试网络,其中net, net_param由于也会被读取为训练网络,所以只允许有一个存在。test_net, test_net_param运行同时存在并可以多于1个。但是最终有多少个测试网络实际运行是通过test_iter参数个数来确定的,如果只指定了2个test_iter,哪怕我们定义了3个测试网络,实际也只会运行2个,另外一个迭代次数为0。优先级上test_net_param>test_net>net_param>net。
    • 对于训练网络,可以在SolverParameter中配置train_state,train_state内容会和网络NetParameter内部的Netstate进行合并,其中train_state数据的优先级要高于NetParameter内部的Netstate。
    • 对于测试网络,要么给每一个测试网络都在SolverParameter中配置一个test_state,要么都不配置。每一个测试网络的test_state会和测试网络NetParameter内部的Netstate进行合并,其中test_state数据的优先级高于NetParameter内部的Netstate。
    • 对于训练网络,Netstat.phase恒等于train;对于测试网络,Netstate.phase恒等于test。
    1. Caffe.cpp启动参数也支持设置state
    DEFINE_string(phase, "",
        "Optional; network phase (TRAIN or TEST). Only used for 'time'.");
    DEFINE_int32(level, 0,
        "Optional; network level.");
    DEFINE_string(stage, "",
        "Optional; network stages (not to be confused with phase), "
        "separated by ','.");
    

    这两个参数实际是与上面SolverParameter的train_state进行合并

      solver_param.mutable_train_state()->set_level(FLAGS_level);
     for (int i = 0; i < stages.size(); i++) {
        solver_param.mutable_train_state()->add_stage(stages[i]);
      }
    

    相关文章

      网友评论

          本文标题:Caffe源码分析—phase/level/stage理解

          本文链接:https://www.haomeiwen.com/subject/vfnuihtx.html