【发布时间】:2019-04-11 04:36:38
【问题描述】:
为了更好地理解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))
所以正常情况下,它会计算骰子损失,但有时它应该随机返回一个nan。但是,这似乎没有发生:
但有时,当我尝试运行代码时,它会在开始时(第一个纪元之前)停止并出现错误,说 An operation has None for gradient. Please make sure that all of your ops have a gradient defined
这是否意味着 Keras 的随机函数只计算一次,然后总是返回相同的值?
如果是这样,为什么会这样?如何创建一个不时返回 nan 的损失函数?
【问题讨论】:
标签: python tensorflow keras nan loss