python - 神经网络 : designing Cost function "not differentiable"/Tensorflow

标签 python tensorflow

我正在使用回归问题测试 Tensorflow 框架。我的输入有很多特征,而我的输出只有一个。 目前,它正在工作,但我认为我的成本函数对于我想要的并不准确,所以我的准确度相当低。

我的目标是在实际输出的 10% 范围内预测输出,也就是说对于每个输出:

if (y_actual - y_predicted) < 0.1 * y_actual :
    cost = 0
else :
    cost = 1

因此对于预测输出向量: [130, 35, 65, 43] 与实际输出向量 [125, 10, 75, 40] 相比,我应该得到 2 的成本。(130 和40 位于 10%,35 和 65 不在)

目前,我使用平方差。

cost = tf.reduce_sum(tf.squared_difference(y_predicted,y_)/(2*nb_batches))

所以实际上,我对输出总和得到了相当好的预测,但如果我认为预测在实际输出的 10% 内是准确的,那么我的准确度只有 60%。 我的准确度是这样写的:

with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.less_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs((y_))) # True if y_diff <= 10% * y_actual
    with tf.name_scope('accuracy'): 
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # count 1 if correct prediction is True ; else False ; Do the sum on all the data tested
    tf.scalar_summary('accuracy', accuracy)

我尝试编写其他成本函数,例如:

cost = tf.reduce_sum(tf.cast((tf.greater_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs(y_))),tf.float32)

但我收到错误:没有为任何变量提供渐变。我认为这是因为我们无法得到tf.cast的导数。

是否有正确的方法来编写适合我的需要的损失函数? 我知道我想要的损失函数不是“可导的”。您认为将其转换为可导函数会是一个解决方案吗?

我不确定我说得是否清楚......

感谢您的帮助!

保罗

最佳答案

您可以使用
来代替比较运算符 tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
获得可微的成本函数。

relu 操作计算 max(0, x),从而给出您正在做的事情的连续版本。主要区别在于,您将因距离较远而受到更多惩罚,因此您没有二元属性(但这通常是您在回归中的目标)。
这应该会产生比平方损失更好的结果。

关于python - 神经网络 : designing Cost function "not differentiable"/Tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147671/

相关文章:

python - 现在开始异步任务,稍后等待

Python/Pandas : combine columns from 2 dataframes based on match of values between columns, 但无法使用合并

python-3.x - TensorFlow 库被编译为使用 SSE 指令,但这些在您的机器上不可用。 : How to solve this?

python - 如何使用 Tensorflow(python) 为 keras model.fit() 创建我自己的数据集?

python - 如何使这个 python 脚本更快? (与此处帖子的分支预测相关的基准测试)

python - ValueError : Expected singleton: res. 伙伴 - Odoo v10 社区

c - 运行 Tensorflow session 会产生一个空张量

ios - 在 iOS 上运行 Tensorflow 时出错

tensorflow - 多输入深度学习中的平均层

python - TensorFlow 中的二进制分类,损失和准确性的意外大值