【问题标题】:Keras loss function understandingKeras损失函数理解
【发布时间】: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


    【解决方案1】:

    只有在定义了损失函数(即调用;这就是 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)
    

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2021-05-23
      • 2020-12-19
      • 2016-03-11
      相关资源
      最近更新 更多