我的印象是所有 tensorflow 原语都是可微的。在这种“幻想”下,我编写了这个函数,希望 tensorflow 能够自动区分它,我可以通过它反向传播错误。
排名权重函数:
def ranked(a):
lens = tf.convert_to_tensor(tf.range(1, (tf.size(a) + 1)))
rankw01 = tf.cast(tf.convert_to_tensor(tf.contrib.framework.argsort(tf.contrib.framework.argsort(a)) + 1),
tf.float64)
rankw02 = tf.convert_to_tensor(rankw01 - ((tf.size(a) + 1)/2))
rankw03 = tf.divide(rankw02, tf.reduce_sum(tf.gather(rankw02, tf.where(tf.greater(rankw02, 0)))))
rankw04 = tf.cast(rankw03, tf.float32)
return rankw04
不幸的是,该函数在正向传递中按预期工作,但在反向传递中不起作用,因为导数不存在(来自我不断得到的错误)。
该功能在附图中进行了说明:
我有以下问题:
1:为什么不能取上面函数的导数。
2:如果这是一个实现问题,你能建议我如何重写它,以便我可以通过它来处理它的派生和反向传播错误吗?
3:所有的张量流操作都是可微的吗?