这是 Spearman 相关性的代码:
predictions_rank = tf.nn.top_k(predictions_batch, k=samples, sorted=True, name='prediction_rank').indices
real_rank = tf.nn.top_k(real_outputs_batch, k=samples, sorted=True, name='real_rank').indices
rank_diffs = predictions_rank - real_rank
rank_diffs_squared_sum = tf.reduce_sum(rank_diffs * rank_diffs)
six = tf.constant(6)
one = tf.constant(1.0)
numerator = tf.cast(six * rank_diffs_squared_sum, dtype=tf.float32)
divider = tf.cast(samples * samples * samples - samples, dtype=tf.float32)
spearman_batch = one - numerator / divider
Spearman 相关性的问题是您需要使用排序算法(top_k
在我的代码中)。并且没有办法将其转化为损失值。没有排序算法的派生。您可以使用正态相关性,但我认为使用均方误差在数学上没有差异。
我现在正在研究图像。我在论文中读到,他们用来将排名添加到损失函数中的是比较 2 或 3 个图像(我说的是图像,你可以说你想要排名的任何内容)。
比较两个元素:
其中 N 是元素总数,α 是边距值。我得到这个方程具有属性和内容适配的照片美学排名网络 https://arxiv.org/abs/1606.01621
您还可以使用具有 3 个元素的损失,将其中两个具有相似排名的元素与另一个具有不同排名的元素进行比较:
但在这个等式中你还需要添加排名的方向,更多细节在人们会喜欢你的形象吗? https://arxiv.org/abs/1611.05203。在本文中,他们使用矢量编码而不是实际值,但您也可以只对数字进行编码。
就图像而言,当这些图像相关时,图像之间的比较更有意义。因此,运行聚类算法来创建(也许?)10 个聚类是一个好主意,这样您就可以使用同一聚类的元素来进行比较,而不是使用非常不同的元素。这将有助于网络,因为输入以某种方式相关,而不是完全不同。
作为旁注,您应该知道什么对您来说更重要,是最终排名顺序还是排名值。如果它是你应该使用均方误差的值,如果它是排名顺序,你可以使用我之前写的损失。或者你甚至可以将它们结合起来。
如何确定运行时查看的张量的大小?
tf.shape(tensor)
返回具有形状的张量。然后你可以使用tf.gather(tensor,index)
以获得您想要的值。