Как я могу исправить подсчет потерь моих кубиков в процессе обучения сверточной нейронной сети, реализованной в Keras? - PullRequest
0 голосов
/ 02 мая 2019

Я реализую свой собственный код, используя keras для выполнения семантической сегментации. Мои тестовые изображения имеют форму (10, 512, 512, 5), где 10 - это количество изображений, 512 - их размер и 5 - количество классов, которые я хочу сегментировать. В качестве последней функции активации я использую softmax, а в качестве потери я хочу извлечь потерю костей (https://arxiv.org/abs/1606.04797), чтобы улучшить результаты сегментации. Мой код:

eps = 1e-3

def dice(y_true, y_pred):
    y_pred = K.one_hot(K.argmax(y_pred,axis=-1), Nclasses) 
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    num = 2*K.sum(y_true_f*y_pred_f)
    den = K.sum(K.square(y_true_f))+K.sum(K.square(y_pred_f))+eps
    return num/den

def dice_loss(y_true, y_pred):
    return 1-dice(y_true, y_pred)

Я использую K.one_hot(K.argmax(...)), потому что таким образом мой y_pred является двоичным и не сделан по вероятностям (верно?). В любом случае, когда начинается тренировочный процесс, я получаю эту ошибку:

"ValueError: An operation has None for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval."

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Попробуйте использовать этот фрагмент кода для коэффициента кости. Важное замечание: если у вас есть маски с горячим кодированием, этот код также должен работать для многоклассовой сегментации.

smooth = 1.

def dice_coef(y_true, y_pred):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)


def dice_coef_loss(y_true, y_pred):
    return -dice_coef(y_true, y_pred)
0 голосов
/ 02 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...