2016-07-01 5 views

Antwort

2

Ja, Sie können eine benutzerdefinierte Verlustfunktion mit Pycaffe hinzufügen. Hier ist ein Beispiel für die Euklidische Verlustschicht in Python (aus Caffe Github repo). Sie müssen die Verlustfunktion in Vorwärts-Funktion zur Verfügung zu stellen und es ist Steigung in Rückwärtsmethode:

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 

speichert es als pyloss.py zum Beispiel. Anschließend können Sie die Python-Ebene in der prototxt Datei, um sie zu laden verwenden:

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 
} 

oder in Ihrem Python-Skript:

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

Nur sehr vorsichtig sein bei der Berechnung und implemeting die Gradienten (Rückwärtsfunktion) seit es neigt dazu, fehleranfällig zu sein.

+0

können Sie [diese Implementierung] (https://github.com/tnarihi/caffe/blob/python-gradient-checker/python/caffe/test/test_gradient_checker.py) von Gradientenprüfung util für Python verwenden. – Shai

Verwandte Themen