caffe中使用自定義python層
阿新 • • 發佈:2019-01-25
今天碰巧用到這個,遇到了一些問題,所以順便記錄下來。
直接使用train.sh中的方式,應該是行不通
比如如下的方式
#!/usr/bin/env sh
set -e
./build/tools/caffe train --solver=/***/adam_solver.prototxt --gpu=1,2,3
這樣總會提示說 ImportError: No module named python.NormlizedMSE
使用python呼叫的方式
實際上faster rcnn也是這麼做的,至於如何在呼叫c++二進位制檔案可執行檔案的時候,仍能找到並執行python層,我也沒有去深入研究,畢竟caffe對python的支援也不是全方位的,比如python呼叫多gpu就會有些問題。
繼續說如何使用這種呼叫方式之前需要說明一些網上的錯誤操作
- 將自定義python層放到
caffe_root/python
下,如果找相關網頁的話,能找到這樣的有幾篇{1,2}。 - 重新編譯pycaffe:
make pycaffe
,比如1 - 還有一些其他不明所以的,可能是誤打誤撞碰對了吧3
知其然的做法
- solver的寫法
import sys sys.path.append('~/work/caffe_master/python') # for import caffe sys.path.append('~/work/Myproject/train/') # for python layer, 這兒指明python的呼叫路徑 import caffe caffe.set_device(1) caffe.set_mode_gpu() solver=caffe.SGDSolver('~/work/Myproject/adam_solver.prototxt') solver.solve()
- prototxt的寫法
layer { type: 'Python' name: 'loss' top: 'loss' bottom: 'Dense3' bottom: 'landmarks' python_param { # 自定義層模組的名字,注意,這兒一定是和上面solver中的路徑相配合的 module: 'NormlizedMSE' # the layer name -- the class name in the module layer: 'NormlizedMSE' } # set loss weight so Caffe knows this is a loss layer. # since PythonLayer inherits directly from Layer, this isn't automatically # known to Caffe loss_weight: 1 }
這兒是重點:NormlizedMSE.py 在路徑’~/work/Myproject/train/'下,也就是用於訓練的python檔案中呼叫的函式。