gpt4 book ai didi

python - 如何在 keras 损失函数中使用 tf.nn.top_k?

转载 作者:行者123 更新时间:2023-11-28 22:30:09 24 4
gpt4 key购买 nike

我在使此自定义损失函数(它检查 y_pred 数据的排序是否与 y_true 提供的实际排序索引)工作时遇到了一些问题:

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 可能有问题,因为我看不出它是如何微分的,但我没有更好的评估想法预测顺序的差异。提示/想法/论文/引用资料? :)

最佳答案

这可能会被否决,因为我不会真正修复您的代码,但这里什么也没有:

我确实不相信您可以将 top_k 用作目标函数。就像您不能将准确性用作目标函数一样。

原因是数学上的。即使 keras、tensorflow、theano 和 co。是很棒的人工智能工具,让每个人都能摆弄神经网络,后者仍然是非常复杂的数学工具。这些数学很好地隐藏在幕后,但在尝试比预制工具走得更远时,您应该意识到它们。

当您训练网络时,您会计算网络在示例中的错误程度,然后反向传播该错误以从中学习。反向传播背后的算法是优化器,更准确地说,它们是基于梯度的优化器。计算梯度需要区分我们正在优化的函数,即损失函数/目标函数。这意味着目标必须是可区分的。精度不是可微函数,它以 0 和 1 之间的实数作为输入,并输出阶梯函数:如果 x<0.5 则为 0,如果 x>0.5 则为 1。该函数不可微分,因为我们无法在 0.5 内获得它的梯度。 top_k 函数是某种精度函数。所以在我看来你确实不能在目标中使用它,因为在引擎盖下,智能 tensorflow 必须计算你的函数的梯度。

希望对您有所帮助:)

关于python - 如何在 keras 损失函数中使用 tf.nn.top_k?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42512981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com