Caffe:如何获得Python层的阶段?

时间:2015-12-31 17:35:59

标签: python neural-network deep-learning caffe pycaffe

我在caffe中创建了"Python"图层"myLayer",并在网train_val.prototxt中使用它我像这样插入图层:

layer {
  name: "my_py_layer"
  type: "Python"
  bottom: "in"
  top: "out"
  python_param {
    module: "my_module_name"
    layer: "myLayer"
  }
  include { phase: TRAIN } # THIS IS THE TRICKY PART!
}

现在,我的图层只参与网络的TRAIN阶段,
我怎么知道我的图层的setup函数??

class myLayer(caffe.Layer):
  def setup(self, bottom, top):
     # I want to know here what is the phase?!!
  ...

PS,
我也在"Caffe Users" google group上发布了这个问题。如果有什么东西在那里,我会更新。

2 个答案:

答案 0 :(得分:7)

正如galloguille所指出的那样,caffe现在将phase暴露给python层类。这个新功能使这个答案有点多余。了解caffe python层中的param_str是否有用,可以将其他参数传递给图层。

原始答案:

AFAIK没有琐碎的方式获得阶段。但是,可以将任意参数从net prototxt传递给python。这可以使用param_str的{​​{1}}参数来完成 以下是它的完成方式:

python_param

在python中,你在图层的layer { type: "Python" ... python_param { ... param_str: '{"phase":"TRAIN","numeric_arg":5}' # passing params as a STRING 函数中得到param_str

setup

答案 1 :(得分:6)

这是一个非常好的解决方法,但如果您只想将phase作为参数传递,那么现在您可以将该阶段作为图层的属性进行访问。此功能仅在6天前合并https://github.com/BVLC/caffe/pull/3995

特定提交:https://github.com/BVLC/caffe/commit/de8ac32a02f3e324b0495f1729bff2446d402c2c

使用此新功能,您只需使用属性self.phase即可。例如,您可以执行以下操作:

class PhaseLayer(caffe.Layer):
"""A layer for checking attribute `phase`"""

def setup(self, bottom, top):
    pass

def reshape(self, bootom, top):
    top[0].reshape()

def forward(self, bottom, top):
    top[0].data[()] = self.phase