关于message NetState和message NetStateRule的问题

message NetState {
  optional Phase phase = 1 [default = TEST];
  optional int32 level = 2 [default = 0];
  repeated string stage = 3;
}
这个message里面,level 和 stage分别表示什么意思啊?
 
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;
}
message NetStateRule表示的是什么??
谢谢!
已邀请:

孙琳钧

赞同来自: 李扬 OutLaws zeakey caffe

NetState描述网络的State,在caffe.proto里的定义如下:
message NetState {
optional Phase phase = 1 [default = TEST];
optional int32 level = 2 [default = 0];
repeated string stage = 3;
}
Phase是个枚举类型的变量,取值为{TRAIN, TEST},这个好理解,表示的是网络的两个阶段(训练和测试);Level是个整型变量,stage是个字符串变量,这两个参数不太好翻译,caffe没有提供使用的例子,只能在理解了使用方法后根据需要去使用了。
 
NetStateRule描述的是一种规则,在层的定义里设置,用来决定Layer是否被加进网络,在caffe.proto里的定义如下:
message NetStateRule {
optional Phase phase = 1;
optional int32 min_level = 2;
optional int32 max_level = 3;
repeated string stage = 4;
repeated string not_stage = 5;
}
net.cpp文件里的StateMeetsRule函数用来判断NetState是否符合NetStateRule的规则,符合的条件如下:
NetState的phase与NetStateRule的phase一致
NetState的level在NetStateRule的[min_level, max_level]区间里
NetState的stage包含NetStateRule所列出的所有stage并且不包含任何一个not_stage

网络在初始化的时候会调用函数net.cpp里的FilterNet函数,根据网络的NetState以及层的NetStateRule搭建符合规则的网络。NetState可以在网络的定义文件(NetParameter)或者在Solver文件(SolverParameter)中定义,具体的可以参考caffe.proto,SolverParameter里的优先级高于NetParameter。NetStateRule则需要在层的定义(LayerParameter)中设置,LayerParameter提供include和exclude两种规则,include的优先级高于exclude,有include的时候只看include,符合inlude才被加入;没有include的时候看exclude,符合exclude的层会被踢出网络,未设置规则的层则默认加进网络。
使用NetStateRule的好处就是可以灵活的搭建网络,可以只写一个网络定义文件,用不同的NetState产生所需要的网络,比如常用的那个train和test的网络就可以写在一起。 加上level和stage,用法就更灵活,这里可以发挥想象力了,举个例子,如下定义的网络经过初始化以后'innerprod'层就被踢出去了
state: { level: 2 } 
name: 'example'
layer {
name: 'data'
type: 'Data'
top: 'data'
top: 'label'
}
layer {
name: 'innerprod'
type: 'InnerProduct'
bottom: 'data'
top: 'innerprod'
include: { min_level: 3 }
}
layer {
name: 'loss'
type: 'SoftmaxWithLoss'
bottom: 'innerprod'
bottom: 'label'
}

 

要回复问题请先登录注册