自定义Keras损失函数抛出'ValueError None'

时间:2017-11-22 04:22:28

标签: tensorflow keras

此自定义Keras Loss功能:

def thresholdLoss (actual, predicted):
  rel = predicted / safeActual
  relAbove = tf.greater(rel, 1.50)
  relBelow = tf.less(rel, .50)
  isOutsideThresh = tf.logical_or(relAbove, relBelow, name='outsideRange')
  errCounts = tf.to_float(tf.count_nonzero(isOutsideThresh), name='countToFloat') 
  return errCounts

在fit()调用中抛出以下异常:

ValueError: Tried to convert 'x' to a tensor and failed. Error: None values not supported.

是什么原因导致x成为rmsProp优化器调用的square(x)中的值None

编辑:它是由所有无值的渐变引起的。

如何修改损失函数以确保有效的梯度?

由Keras计算gradients_impl.py:gradients()

1 个答案:

答案 0 :(得分:1)

这是损失函数不连续的结果。它返回一个计数,而不是平滑/连续变化的实值误差。

Keras计算损失函数的梯度。当该函数不连续时,Keras可以返回None值作为梯度向量。这是这个神秘的错误信息的结果。

所以问题只在于最终的' countToFloat'将错误减少到不连续计数的计算。

解决方案是计算连续错误。像这样:

delta = predicted - actual
withinBand = tf.logical_and(tf.greater_equal(rel, .50), tf.less_equal(rel, 1.50))
    err = tf.square(delta)
    err = tf.where(withinBand, .10 * tf.ones_like(actual), err)    # reduce relevance of small error
    mse = K.mean(err)
    return mse