Caffe: как получить фазу слоя Python?

Я создал слой "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!
}

Теперь мой слой участвует только в фазе TRAINing сети,
как я могу узнать об этом в функции setup моего слоя??

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

PS,
я разместил этот вопрос в "Caffe Users" в группе google< /а> тоже. Я обновлю, если там что-нибудь появится.


person Shai    schedule 31.12.2015    source источник


Ответы (2)


Это очень хороший обходной путь, но если вас интересует только передача 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
person Guillem Cucurull    schedule 10.05.2016

Как указал galloguille, caffe теперь предоставляет phase классу слоя python. Эта новая функция делает этот ответ немного избыточным. Тем не менее полезно знать о слое param_str в caffe python для передачи других параметров на уровень.

Оригинальный ответ:

Насколько я знаю, нет тривиального способа получить фазу. Однако можно передавать произвольные параметры из сетевого протокола в 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 в функции 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...
person Shai    schedule 04.01.2016