Keras损失函数理解
Keras loss function understanding
为了更好的理解Keras的一些回调,想人为制造一个nan
损失
这是函数
def soft_dice_loss(y_true, y_pred):
from keras import backend as K
if K.eval(K.random_normal((1, 1), mean=2, stddev=2))[0][0] // 1 == 2.0:
# return nan
return K.exp(1.0) / K.exp(-10000000000.0) - K.exp(1.0) / K.exp(-10000000000.0)
epsilon = 1e-6
axes = tuple(range(1, len(y_pred.shape) - 1))
numerator = 2. * K.sum(y_pred * y_true, axes)
denominator = K.sum(K.square(y_pred) + K.square(y_true), axes)
return 1 - K.mean(numerator / (denominator + epsilon))
所以通常情况下,它会计算骰子损失,但有时它应该随机 return a nan
。然而,这似乎并没有发生:
不过,当我尝试 运行 代码时,它会在开始时(在第一个纪元之前)停止并出现错误,说 An operation has None for gradient. Please make sure that all of your ops have a gradient defined
这是否意味着 Keras 的随机函数只计算一次,然后总是 return 相同的值?
如果是这样,为什么会这样,我如何创建一个 return 不时 nan
的损失函数?
你的第一个条件语句只有在损失函数被定义后才会被评估(即被调用;这就是为什么 Keras 在一开始就停止的原因)。相反,您可以使用 keras.backend.switch 将您的条件整合到图表的逻辑中。您的损失函数可能类似于:
import keras.backend as K
import numpy as np
def soft_dice_loss(y_true, y_pred):
epsilon = 1e-6
axes = tuple(range(1, len(y_pred.shape) - 1))
numerator = 2. * K.sum(y_pred * y_true, axes)
denominator = K.sum(K.square(y_pred) + K.square(y_true), axes)
loss = 1 - K.mean(numerator / (denominator + epsilon))
return K.switch(condition=K.random_normal((), mean=0, stddev=1) > 3,
then_expression=K.variable(np.nan),
else_expression=loss)
为了更好的理解Keras的一些回调,想人为制造一个nan
损失
这是函数
def soft_dice_loss(y_true, y_pred):
from keras import backend as K
if K.eval(K.random_normal((1, 1), mean=2, stddev=2))[0][0] // 1 == 2.0:
# return nan
return K.exp(1.0) / K.exp(-10000000000.0) - K.exp(1.0) / K.exp(-10000000000.0)
epsilon = 1e-6
axes = tuple(range(1, len(y_pred.shape) - 1))
numerator = 2. * K.sum(y_pred * y_true, axes)
denominator = K.sum(K.square(y_pred) + K.square(y_true), axes)
return 1 - K.mean(numerator / (denominator + epsilon))
所以通常情况下,它会计算骰子损失,但有时它应该随机 return a nan
。然而,这似乎并没有发生:
不过,当我尝试 运行 代码时,它会在开始时(在第一个纪元之前)停止并出现错误,说 An operation has None for gradient. Please make sure that all of your ops have a gradient defined
这是否意味着 Keras 的随机函数只计算一次,然后总是 return 相同的值?
如果是这样,为什么会这样,我如何创建一个 return 不时 nan
的损失函数?
你的第一个条件语句只有在损失函数被定义后才会被评估(即被调用;这就是为什么 Keras 在一开始就停止的原因)。相反,您可以使用 keras.backend.switch 将您的条件整合到图表的逻辑中。您的损失函数可能类似于:
import keras.backend as K
import numpy as np
def soft_dice_loss(y_true, y_pred):
epsilon = 1e-6
axes = tuple(range(1, len(y_pred.shape) - 1))
numerator = 2. * K.sum(y_pred * y_true, axes)
denominator = K.sum(K.square(y_pred) + K.square(y_true), axes)
loss = 1 - K.mean(numerator / (denominator + epsilon))
return K.switch(condition=K.random_normal((), mean=0, stddev=1) > 3,
then_expression=K.variable(np.nan),
else_expression=loss)