Нанопотери для пользовательской функции потерь в кератах для сегментации изображения CNN - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь реализовать пользовательскую функцию потерь в кератах для сети сегментации изображений. Но когда я тренирую модель, я получаю nan за потерю. Это пользовательская функция потерь:

def seedloss(y_true,y_pred):
    count = K.sum(K.abs(y_true),axis=[1,2,3],keepdims = True)
    loss = -K.mean(K.sum(y_true*K.log(K.abs(y_pred)),axis=[1,2,3],keepdims=True)/(count))
    return loss

Это мое преобразование приведенной ниже функции потерь в Caffe в керасы:

class SeedLossLayer(caffe.Layer):

def setup(self, bottom, top):
    if len(bottom) != 2:
        raise Exception("The layer needs two inputs!")

    probs = T.ftensor4()
    labels = T.ftensor4()

    count = T.sum(labels, axis=(1, 2, 3), keepdims=True)
    loss_balanced = -T.mean(T.sum(labels * T.log(probs), axis=(1, 2, 3), keepdims=True) / count)

    self.forward_theano = theano.function([probs, labels], loss_balanced)
    self.backward_theano = theano.function([probs, labels], T.grad(loss_balanced, probs))

def reshape(self, bottom, top):
    top[0].reshape(1)

def forward(self, bottom, top):
    top[0].data[...] = self.forward_theano(bottom[0].data[...], bottom[1].data[...])

def backward(self, top, prop_down, bottom):
    grad = self.backward_theano(bottom[0].data[...], bottom[1].data[...])
    bottom[0].diff[...] = grad

Есть ли проблемы с моей реализацией. Почему я получаю nan за потерю. Может ли кто-нибудь помочь мне.

1 Ответ

0 голосов
/ 21 октября 2019

Не похоже, что ваша функция потерь дифференцируема? Вы можете добавить к нему постоянную сглаживания.

...