我试图最大化接近真实值的预测数量,即使这会导致疯狂的异常值,否则可能会偏离中值(我已经有工作损失)或平均值。你知道吗
所以,我尝试这个自定义损失函数:
def lossMetricPercentGreaterThanTenPercentError(y_true, y_pred):
"""
CURRENTLY DOESN'T WORK AS LOSS: NOT DIFFERENTIABLE
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
See https://keras.io/losses/
"""
from keras import backend as K
import tensorflow as tf
diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true), K.epsilon(), None))
withinTenPct = tf.reduce_sum(tf.cast(K.less_equal(diff, 0.1), tf.int32), axis= -1) / tf.size(diff, out_type= tf.int32)
return 100 * (1 - tf.cast(withinTenPct, tf.float32))
我知道至少less_equal
函数是不可微的(我不确定它是否也对tf.size
进行拟合);是否有一些张量运算可以近似“小于或等于”?你知道吗
我使用的是TensorFlow1.12.3,无法升级,所以即使tf.numpy_function(lambda x: np.sum(x <= 0.1) / len(x), diff, tf.float32)
可以作为包装器使用,我也不能使用tf.numpy_function
。你知道吗
从错误消息来看,Keras中似乎没有实现某些梯度操作。你知道吗
您可以尝试使用Tensorflow操作来获得相同的结果(未测试!)地址:
或者,您可以尝试
tf.keras.losses.logcosh(y_true, y_pred)
。你知道吗因为它似乎适合您的用例。见Tf Doc
相关问题 更多 >
编程相关推荐