轉載鏈接:http://withwsf.github.io/2016/04/14/Caffe-with-Python-Layer/
Caffe通過Boost中的Boost.Python模塊來支持使用Python定義Layer:
- 使用C++增加新的Layer繁瑣、耗時而且很容易出錯
- 開發速度與執行速度之間的trade-off
編譯支持Python Layer的Caffe
如果是首次編譯,修改Caffe根目錄下的Makefile.cinfig,uncomment
1 |
WITH_PYTHON_LAYER:=1 |
如果已經編譯過
1 |
make clean |
使用Python Layer
在網絡的prototxt文件中添加一個Python定義的loss層如下:
1 |
layer{ |
定義Python Layer
根據上面的要求,我們在$PYTHONPAT在創建pyloss.py,並在其中定義EuclideanLossLayer。
1 |
import caffe |
原理淺析
閱讀caffe源碼pythonlayer.hpp可以知道,類PythonLayer繼承自Layer,並且新增私有變量boost::python::object self來表示我們自己定義的python layer的內存對象。
類PythonLayer類的成員函數LayerSetUP, Reshape, Forward_cpu和Backward_cpu分別是對我們自己定義的python layer中成員函數setup, reshape, forward和backward的封裝調用。
1 |
class PythonLayer : public Layer<Dtype> { |
整體流程大致為:首先從文件中讀入solver並生成一個solver,然后根據solver的net路徑生成一
個net,net調用layer_factory循環生成每個層,最后根據讀入model或是filler來初始化參數。從上面的流程可以知道layer_factory是循環生成每個層,我看.cpp文件也的確寫了#if
WITH_PYTHON_LAYER,然后有什么什么操作,比如儲存python
layer的python_param,並調用setup,這里實際上已經是利用boost進行C++
Python混編了。這些操作的定義就在python_layer.hpp文件中。
layer_factory中python
layer的setup相關具體操作是,先根據param找到module的位置,再加載module,再根據層名加載層,然后前向計算反向計算什么的。
這些就已經算是達到目的了。不過只是知道相對路徑,怎么可能加載成功呢?然后又繼續找啊找,終於在faster
rcnn的tools文件中找到。_init_paths里有寫一些預操作,比如將lib路徑寫入PYTHONPATH中,當然如果寫入的話,這樣就可以
直接加載了。
