一个可微张量运算近似小于或等于?

2024-09-30 06:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图最大化接近真实值的预测数量,即使这会导致疯狂的异常值,否则可能会偏离中值(我已经有工作损失)或平均值。你知道吗

所以,我尝试这个自定义损失函数:

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。你知道吗


Tags: 函数importnonetruetfasdiffabs
1条回答
网友
1楼 · 发布于 2024-09-30 06:17:13

从错误消息来看,Keras中似乎没有实现某些梯度操作。你知道吗

您可以尝试使用Tensorflow操作来获得相同的结果(未测试!)地址:

 diff = tf.abs(y_true - y_pred) / tf.clip_by_value(tf.abs(y_true), 1e-12, 1e12))
 withinTenPct = tf.reduce_mean(tf.cast(tf.less_equal(diff, tf.constant(0.1, dtype=tf.float32, shape=tf.shape(diff)), tf.int32)))
 return 100.0 * (1.0 - tf.cast(withinTenPct, tf.float32))

或者,您可以尝试tf.keras.losses.logcosh(y_true, y_pred)。你知道吗

因为它似乎适合您的用例。见Tf Doc

相关问题 更多 >

    热门问题