caffe NetState 参数中 level stages解释

level stages这两个参数网上没有太多解释,但实际上这两个参数可以一定程度增加网络的灵活程度,只需要设置几个数字即可便捷的在网络初始化阶段进行网络各层的删减和增加。并且可以便捷的进行网络层次设置,便于多网络级联等操作。

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是个字符串变量。
 
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一致,一般是Train或Test。
NetState的level(数字)在NetStateRule的[min_level, max_level]区间里。

NetState的stage(字符)包含NetStateRule所列出的所有stage并且不包含任何一个not_stage。即要包含的放在stage里,要在当前网络下去除的放在not_stage里。

个人感觉,这一设置非常适合于搭建级联网络,或者多网络协同工作等情况。通过设置level,对应不同级联阶段,到了哪个阶段包含哪些层就一目了然了,不用来回删加,也不用写多个文件。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' 
}

你可能感兴趣的:(caffe源码,caffe,pytorch,源码共读,项目分享)