Python 为什么我的损失计算作为一个度量是正确的,而不是作为张量流中的损失?
我正在训练一个3D U型网络,并试图用Tensorflow实现一个骰子损失。我创建了以下函数,它可以返回骰子分数或相应的损失Python 为什么我的损失计算作为一个度量是正确的,而不是作为张量流中的损失?,python,tensorflow,keras,loss-function,Python,Tensorflow,Keras,Loss Function,我正在训练一个3D U型网络,并试图用Tensorflow实现一个骰子损失。我创建了以下函数,它可以返回骰子分数或相应的损失(1-score) 在训练模特时,我设定了损失和分数 model.compile(optimizer=optimizer, loss=dice_coefficient(_type="loss"), metrics=dice_coefficient(_type="score"))
(1-score)
在训练模特时,我设定了损失和分数
model.compile(optimizer=optimizer,
loss=dice_coefficient(_type="loss"),
metrics=dice_coefficient(_type="score"))
然而,我得到了损失的nan
和分数的数值:损失不应该是上面定义的1-score
144/Unknown - 68s 473ms/step - loss: nan - dice_score: 0.0209
我已经实现了骰子损失函数来优化图像分割。您可以在此路径上签出代码 下面是代码片段
class Dice(Loss):
def call(self, y_true, y_pred):
y_pred = ops.convert_to_tensor_v2(y_pred)
y_true = gen_math_ops.cast(y_true, y_pred.dtype)
y_true = tf.keras.backend.clip(y_true, tf.keras.backend.epsilon(), 1-tf.keras.backend.epsilon())
y_pred = tf.keras.backend.clip(y_pred, tf.keras.backend.epsilon(), 1-tf.keras.backend.epsilon())
intersection = tf.keras.backend.sum(tf.keras.backend.abs(y_true * y_pred), axis=-1)
numerator = (2. * intersection + 1)
denominator = (tf.keras.backend.sum(tf.keras.backend.square(y_true),-1) + tf.keras.backend.sum(tf.keras.backend.square(y_pred),-1) + 1)
return 1 - (numerator/denominator)
class Dice(Loss):
def call(self, y_true, y_pred):
y_pred = ops.convert_to_tensor_v2(y_pred)
y_true = gen_math_ops.cast(y_true, y_pred.dtype)
y_true = tf.keras.backend.clip(y_true, tf.keras.backend.epsilon(), 1-tf.keras.backend.epsilon())
y_pred = tf.keras.backend.clip(y_pred, tf.keras.backend.epsilon(), 1-tf.keras.backend.epsilon())
intersection = tf.keras.backend.sum(tf.keras.backend.abs(y_true * y_pred), axis=-1)
numerator = (2. * intersection + 1)
denominator = (tf.keras.backend.sum(tf.keras.backend.square(y_true),-1) + tf.keras.backend.sum(tf.keras.backend.square(y_pred),-1) + 1)
return 1 - (numerator/denominator)