【问题标题】:Neural Networks : designing Cost function "not differentiable" / Tensorflow神经网络:设计成本函数“不可微”/Tensorflow
【发布时间】:2016-05-11 05:44:30
【问题描述】:

我正在测试带有回归问题的 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 的导数。

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

我不确定我是否很清楚......

感谢您的帮助!

保罗

【问题讨论】:

  • 我认为当你的变量没有路径到损失函数时会发生错误。可能是您的图形定义中的一个错误。
  • 是的,我认为使用 tf.cast,Tensorflow 无法返回变量...但是由于成本需要浮动...
  • 您是否碰巧找到了tf.cast 的解决方法?

标签: python tensorflow


【解决方案1】:

您可以使用
tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
,而不是使用比较运算符 得到一个可微的代价函数。

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

【讨论】:

  • 感谢您的回答。我认为只是一个错字:我认为应该是 tf.nn.relu(tf.abs(y_predicted-y_)- 0.1*tf.abs(y_)) 正如你所说,“27”的一个错误是算为“1”的27个错误,而准确性则不是这样。
  • 实际上,我得到的准确度比使用平方损失时要小...可能是“计算”非空值的数量,但我不知道任何 TF执行此操作并测试 np.count_nonzero 的函数,它不起作用。另外,我想知道是否使用错误函数,即 Erf(alpha*x) 会很合适...
猜你喜欢
  • 2022-01-01
  • 2013-06-09
  • 2011-01-02
  • 2016-12-09
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多