我正在使用回归问题测试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)
但我收到错误:No gradients provided for any variable
。我认为这是因为我们无法得到tf.cast
的衍生物。
是否有正确的方法来编写符合我需求的损失函数? 我知道我想要的损失功能不是&#34;可推导的&#34;。您是否认为将其转换为可派生函数是一种解决方案?
我不确定我是否很清楚...
感谢您的帮助!
保
答案 0 :(得分:1)
您可以使用
而不是使用比较运算符
tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
获得可区分的成本函数。
relu操作计算max(0,x),因此将给出你正在做的连续版本。主要的区别在于你会因为更远而受到更多惩罚,因此你没有二元属性(但这通常是你在回归中的目标)。
这应该比平方损失产生更好的结果。