2017-02-02 12 views
2

У меня есть вопрос о возвратной функции в слое потери Caffe. Я видел реализацию евклидовой слоя потери на: https://github.com/BVLC/caffe/blob/master/examples/pycaffe/layers/pyloss.pyCaffe loss layer - обратная функция

В конце года назад функция определяется следующим образом:

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 

Я знаю, что дно [0] указывает на то, прогнозируемое значение и bottom [1] - целевые значения (наземная правда).
Вы можете помочь мне понять, почему знак - +1 для прогноза и -1 для целей? Я думал, что нам не нужно было присваивать значения внизу [1] .diff для целей.

Если у меня проблема с несколькими метками, как я могу обновить код?

ответ

1

Когда bottom[1] является землей, вы должны ожидать, что propagate_down[1] будет False, поэтому градиент не распространяется на метки.
Однако, если вы используете этот слой потерь для сравнения двух обучаемых капель, вы хотели бы распространять градиенты как на bottom.

Знак только из-за производной от этой конкретной потери, напишите производную и вы увидите, откуда она взялась.

Единственное, что мне не хватает, это top[0].diff. Если я правильно понимаю, он должен содержать loss_weight, определенный для этого слоя ...