我正在使用回归问题测试 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/