2016-07-01 11 views

答えて

2

はい、pycaffeでカスタム損失関数を追加できます。以下にPythonのユークリッド損失層の例を示します(Caffe Github repoから取得)。あなたは前方関数で損失関数を提供する必要があり、後方の方法では勾配です。

import caffe 
import numpy as np 

class EuclideanLossLayer(caffe.Layer): 
    """ 
    Compute the Euclidean Loss in the same manner as the C++ EuclideanLossLayer 
    to demonstrate the class interface for developing layers in Python. 
    """ 

    def setup(self, bottom, top): 
     # check input pair 
     if len(bottom) != 2: 
      raise Exception("Need two inputs to compute distance.") 

    def reshape(self, bottom, top): 
     # check input dimensions match 
     if bottom[0].count != bottom[1].count: 
      raise Exception("Inputs must have the same dimension.") 
     # difference is shape of inputs 
     self.diff = np.zeros_like(bottom[0].data, dtype=np.float32) 
     # loss output is scalar 
     top[0].reshape(1) 

    def forward(self, bottom, top): 
     self.diff[...] = bottom[0].data - bottom[1].data 
     top[0].data[...] = np.sum(self.diff**2)/bottom[0].num/2. 

    def backward(self, top, propagate_down, bottom): 
     for i in range(2): 
      if not propagate_down[i]: 
       continue 
      if i == 0: 
       sign = 1 
      else: 
       sign = -1 
      bottom[i].diff[...] = sign * self.diff/bottom[i].num 

例えばpyloss.pyとして保存してください。あなたはそれをロードするために、あなたのprototxtファイルでPythonの層を使用することができます。

layer { 
    type: 'Python' 
    name: 'loss' 
    top: 'loss' 
    bottom: 'ipx' 
    bottom: 'ipy' 
    python_param { 
    # the module name -- usually the filename -- that needs to be in $PYTHONPATH 
    module: 'pyloss' 
    # the layer name -- the class name in the module 
    layer: 'EuclideanLossLayer' 
    } 
    # 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 
} 

またはあなたのPythonスクリプトで:

n.loss = L.Python(n.ipx, n.ipy,python_param=dict(module='pyloss',layer='EuclideanLossLayer'), 
        loss_weight=1) 

は、ただ非常にコンピューティングに注意して以来、勾配(後方関数)implemetingことエラーを起こしやすい傾向があります。

+0

pythonのグラデーションチェックutilの[この実装](https://github.com/tnarihi/caffe/blob/python-gradient-checker/python/caffe/test/test_gradient_checker.py)を使用できます。 – Shai

関連する問題