Я реализую свой собственный код, используя 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."