2017-02-28 24 views
1

我有一些问题,使得这个自定义损失函数(它会检查是否y_pred数据与由y_true提供真正的订货指数连贯有序的)工作:如何在keras丢失函数中使用tf.nn.top_k?

def custom_objective(y_true, y_pred): 
    y_true = tf.cast(y_true, tf.float32) 
    ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32) 
    return tf.sqrt(tf.reduce_mean(tf.square(ordered_output - y_true), axis=-1)) 

我可以正常使用示例数据运行:

with tf.Session() as sess: 
    print(custom_objective(tf.constant([0, 1, 2, 3, 4, 5]), 
          tf.constant([0.0, 0.9, 0.2, 0.3, 0.5, 0.8])).eval()) # 1.82574 

但不知何故,如果我在model.compile使用它,因为它提出了它不工作:

/Users/luca/.virtualenvs/python3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape) 
    358 else: 
    359  if values is None: 
--> 360  raise ValueError("None values not supported.") 
    361  # if dtype is provided, forces numpy array to be the type 
    362  # provided if possible. 

ValueError: None values not supported. 

请注意,如果我将ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32)更改为ordered_output = -y_pred,那么在我的训练测试集中没有“无”值,该模型编译良好并开始正确训练(但显然不是我想要的损失函数)。

我有一种微妙的感觉,在亏损函数中使用top_k时可能会出现错误,因为我没有看到它如何可以微分,但我没有更好的方法来评估预测排序中的差异。提示/创意/纸/引用? :)

+0

是'y_true'订单数据还是有序数据的indeces? –

+0

@MarcinMożejko第二。 y最初是有序的,然后在训练之前进行洗牌,y_true表示我想要预测的有序数据的索引。 atm我默认使用MSE来预测它,但它不是超高效的 – luke14free

+0

我可能会告诉你如何重写你的模型来优化它以获得你想要的结果。目前 - 你的模型可能做得很差。 –

回答

2

这可能被否决,因为我不会真正解决您的代码,但在这里不用什么:

我不相信,事实上,你可以使用top_k为目标函数。就像你不能将精确度用作目标函数一样。

原因是数学上的。即使keras,tensorflow,theano和co。是非常棒的AI工具,允许每个人都摆弄神经网络,后者仍然是非常复杂的数学工具。这些数学很好地隐藏在引擎盖下,但当你试图比预制工具更进一步时,你应该意识到它们。

当你训练一个网络时,会发生什么情况是你计算出一个例子中网络的错误,并且你反向传播那个错误以从中学习。反向传播背后的算法是优化器,更准确地说,它们是基于梯度的优化器。计算梯度需要区分我们正在优化的功能,损失/目标函数。这意味着目标必须可区分。精度不是一个可微函数,它将0到1之间的实数作为输入,并输出阶梯式函数:如果x <为0.5,则为0,如果x> 0.5,则为1。这个函数不是可微的,因为我们无法在0.5中获得它的梯度。 top_k函数是某种精度函数。所以在我看来,你不能将它用于目标,因为在引擎盖下,智能张量流必须计算你的函数的梯度。

我希望这有助于:)

+0

再次感谢您的帮助/输入Nassim,您说的话非常有意义,也是我的预期。尽管如此,我还是看到有人在用神经网络玩弄东西,我想知道是否有一种明智的方法来处理这类问题。例如,用于检查的“弱”选择是使用MSE或Categorical Crossentropy,但是我会失去关于数据排序的很多信息。 – luke14free

+0

你能提供更多关于你想要实现的信息吗?投入,目标和为什么你想要做的一个小例子将是完美的! –

相关问题