Что такое слой `` Python '`в caffe?

Caffe имеет тип слоя "Python".

Например, этот тип слоя можно использовать как уровень потерь.
В других случаях он используется как уровень ввода.

Что это за тип слоя? Как этот слой можно использовать?

Ответы

Ответ 1

Обрезать и Ответы Bharat дают общую цель слоя "Python" : уровень общего назначения, который реализован на языке python, а не на С++.

Я намереваюсь этот ответ служить учебником для использования слоя "Python" .


Учебник для "Python" layer

что такое "Python" ?

Пожалуйста, ознакомьтесь с отличными ответами Обрезать и Бхарат.

Предпосылка

Чтобы использовать слой 'Python, вам нужно скомпилировать caffe с флагом

  WITH_PYTHON_LAYER: = 1
Код>

установить в <код > 'Makefile.config'.

Как реализовать слой "Python" ?

A Уровень "Python" должен быть реализован как класс python, полученный из базового класса caffe.Layer. Этот класс должен иметь следующие четыре метода:

  import caffe
class my_py_layer (caffe.Layer): def setup (self, bottom, top):   проходить
 def reshape (self, bottom, top):   проходить
 def forward (self, bottom, top):   проходить
 def назад (self, top, propagate_down, bottom):   проходить
Код>

Что это за методы?

def setup (self, bottom, top): этот метод вызывается один раз, когда caffe создает сеть. Эта функция должна проверить, что количество входов ( len (внизу)) и количество выходов ( len (вверху)) соответствует ожиданиям.
Вы также должны выделить внутренние параметры сети здесь (например, self.add_blobs()), см. этот поток для получения дополнительной информации.
Этот метод имеет доступ к self.param_str - строке, переданной от прототипа к слою. Подробнее см. этот поток.

def reshape (self, bottom, top): этот метод вызывается всякий раз, когда caffe преобразует сеть. Эта функция должна выделять выходы (каждый из top blobs). Форма выходов обычно связана с формой bottom s.

def forward (self, bottom, top): Внедрение переадресации из внизу в top.

def backward (self, top, propagate_down, bottom): этот метод реализует backpropagation, он распространяет градиенты от top до < код > нижнийкод > . propagate_down является булевым вектором len (внизу), указывающим, какой из bottom s должен распространяться градиент.

Более подробную информацию о вводе bottom и top вы можете найти в этом размещать.

Примеры
Вы можете увидеть некоторые примеры упрощенных слоев python здесь, здесь и здесь.
Пример уровня выходного уровня "скользящий средний" можно найти здесь.

Настраиваемые параметры
Уровень "Python" может иметь обучаемые параметры (например, "Conv" , "InnerProduct" и т.д.).
Вы можете найти дополнительную информацию о добавлении обучаемых параметров в этот поток и этот. Существует также упрощенный пример в caffe мерзавец.

Как добавить слой "Python" в прототипе?

Подробнее см. ответ Bharat.
Вам нужно добавить в свой прототип следующее:

  layer { name: 'rpn-data' type: 'Python' bottom: 'rpn_cls_score' bottom: 'gt_boxes' bottom: 'im_info' bottom: 'data' top: 'rpn_labels' top: 'rpn_bbox_targets' top: 'rpn_bbox_inside_weights' top: 'rpn_bbox_outside_weights' python_param {   module: 'rpn.anchor_target_layer' # имя модуля python, где ваша реализация   layer: 'AnchorTargetLayer' # имя реализации класса   param_str: "'feat_stride': 16" # дополнительных параметров для слоя }
}
Код>

Как добавить слой "Python" с помощью интерфейса pythonic NetSpec?

Это очень просто:

  import caffe
из слоев импорта кофе как L

ns = caffe.NetSpec()
# определить слои здесь...
ns.rpn_labels, ns.rpn_bbox_targets, \ ns.rpn_bbox_inside_weights, ns.rpn_bbox_outside_weights = \   L.Python(ns.rpn_cls_score, ns.gt_boxes, ns.im_info, ns.data,            name= 'RPN-данных',            ntop = 4, # tell caffe ожидает четыре выходных капли            python_param = {'module': 'rpn.anchor_target_layer',                          'layer': 'AnchorTargetLayer',                          'param_str': ''\'feat_stride \': 16 "'})
Код>

Как использовать сеть с слоем "Python" ?

Вызов кода python из caffe - это не о чем беспокоиться. Caffe использует boost API для вызова кода python из скомпилированного С++.
Что вам нужно сделать?
Убедитесь, что модуль python, реализующий ваш слой, находится в $PYTHONPATH, так что, когда caffe import s it - его можно найти.
Например, если ваш модуль my_python_layer.py находится в /path/to/my_python_layer.py, то

  PYTHONPATH =/path/to: $PYTHONPATH $CAFFE_ROOT/build/tools/caffe train -solver my_solver.prototxt
Код>

должен работать нормально.

Как проверить мой слой?

Вы должны всегда тестировать свой слой, прежде чем использовать его.
Тестирование функции forward полностью зависит от вас, так как каждый уровень имеет другую функциональность.
Тестирование метода backward easy, так как этот метод реализует только градиент forward, он может быть численно протестирован автоматически!
Проверьте test_gradient_for_python_layer:

  импортировать numpy как np
из test_gradient_for_python_layer import test_gradient_for_python_layer

# установить входы
input_names_and_values ​​= [('in_cont', np.random.randn(3,4)),                         ('in_binary', np.random.binomial(1, 0,4, (3,1))]
output_names = ['out1', 'out2']
py_module = 'folder.my_layer_module_name'
py_layer = 'my_layer_class_name'
param_str = 'некоторые параметры'
propagate_down = [True, False]

# вызов теста
test_gradient_for_python_layer (input_names_and_values, output_names,                              py_module, py_layer, param_str,                              propagate_down)

# вы сделали!
Код>

Специальное уведомление

Стоит отметить, что код python работает только на процессоре. Таким образом, если вы планируете иметь уровень Python в середине вашей сети, вы увидите снижение значительного производительности, если вы планируете использовать GPU. Это происходит потому, что caffe нужно скопировать blob с GPU на CPU, прежде чем вызывать уровень python, а затем скопировать обратно на GPU, чтобы продолжить передачу вперед/назад.
Это ухудшение гораздо менее значимо, если слой python является либо входным, либо верхним слоем потерь.
Обновление: 19 сентября 2017 года PR # 5904 было сливается с мастером. Этот PR предоставляет графические указатели blobs через интерфейс python. Вы можете получить доступ к blob._gpu_data_ptr и blob._gpu_diff_ptr прямо из python на свой страх и риск.

Ответ 2

Очень просто, это слой, в котором вы предоставляете код реализации, вместо того, чтобы использовать один из предварительно определенных типов - все они подкреплены эффективными функциями.

Если вы хотите определить пользовательскую функцию потерь, продолжайте: напишите ее самостоятельно и создайте слой с типом Python. Если у вас есть нестандартные потребности ввода, возможно, некоторая предварительная обработка данных, никаких проблем: напишите сами и создайте слой с типом Python.

Ответ 3

Уровни Python отличаются от уровней С++, которые необходимо скомпилировать, их параметры необходимо добавить в прото файл и, наконец, вам нужно зарегистрировать слой в layer_factory. Если вы пишете слой python, вам не нужно беспокоиться ни о какой из этих вещей. Параметры уровня могут быть определены как строка, доступная в виде строки в python. Например: если у вас есть параметр в слое, вы можете получить к нему доступ, используя 'self.param_str', если param_str был определен в вашем файле прототипа. Как и другие слои, вам необходимо определить класс со следующими функциями:

  • Настройка - Инициализация вашего слоя с использованием параметров, полученных из переменных уровня
  • Вперед - что будет вводить и выводить слой
  • Назад - с учетом прогноза и градиентов со следующего уровня вычислите градиенты для предыдущего слоя
  • Reshape - При необходимости измените свой blob

Пример прототипа:

layer {
  name: 'rpn-data'
  type: 'Python'
  bottom: 'rpn_cls_score'
  bottom: 'gt_boxes'
  bottom: 'im_info'
  bottom: 'data'
  top: 'rpn_labels'
  top: 'rpn_bbox_targets'
  top: 'rpn_bbox_inside_weights'
  top: 'rpn_bbox_outside_weights'
  python_param {
    module: 'rpn.anchor_target_layer'
    layer: 'AnchorTargetLayer'
    param_str: "'feat_stride': 16"
  }
}

Здесь имя слоя - это rpn-данные, нижний и верхний - данные ввода и вывода слоя соответственно. python_param определяет, каковы параметры уровня Python. 'module' указывает, что такое имя вашего слоя. Если файл с именем "anchor_target_layer.py" находится внутри папки с именем "rpn", параметр будет "rpn.anchor_target_layer". Параметр "layer" - это имя вашего класса, в этом случае это "AnchorTargetLayer". Параметр "param_str" - это параметр для слоя, который содержит значение 16 для ключа "feat_stride".

В отличие от слоев С++/CUDA, уровни Python в настоящее время не работают в настройках с несколькими GPU в caffe, поэтому это недостаток их использования.