Ответ 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 на свой страх и риск.