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()
?
答案 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