10

我在 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网络的 ing 阶段,
我怎么知道我层的setup功能?

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

PS,我也在“Caffe Users”谷歌组
上发布了这个问题。如果有任何弹出,我会更新。

4

2 回答 2

7

正如galloguille所指出的,caffe 现在正在phase向 python 层类公开。这个新功能使这个答案有点多余。param_str了解caffe python 层以将其他参数传递给该层仍然很有用。

原答案:

AFAIK 没有简单的方法来获得相位。但是,可以将网络 prototxt 中的任意参数传递给 python。这可以使用 的param_str参数来完成python_param
这是如何完成的:

layer {
  type: "Python"
  ...
  python_param {
    ...
    param_str: '{"phase":"TRAIN","numeric_arg":5}' # passing params as a STRING

在 python 中,你得到param_str了 layer 的setup函数:

import caffe, json
class myLayer(caffe.Layer):
  def setup(self, bottom, top):
    param = json.loads( self.param_str ) # use JSON to convert string to dict
    self.phase = param['phase']
    self.other_param = int( param['numeric_arg'] ) # I might want to use this as well...
于 2016-01-04T10:13:44.107 回答
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
于 2016-05-10T12:33:16.120 回答