1. 程式人生 > >caffe中使用自定義python層

caffe中使用自定義python層

今天碰巧用到這個,遇到了一些問題,所以順便記錄下來。

直接使用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就會有些問題。

繼續說如何使用這種呼叫方式之前需要說明一些網上的錯誤操作
  1. 將自定義python層放到caffe_root/python下,如果找相關網頁的話,能找到這樣的有幾篇{1,2}。
  2. 重新編譯pycaffe:make pycaffe,比如1
  3. 還有一些其他不明所以的,可能是誤打誤撞碰對了吧3
知其然的做法
  1. 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()
  1. 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檔案中呼叫的函式。