我的印象是所有张量流原语都是可区分的。在这种“幻觉”下,我编写了此函数,希望张量流能够自动区分它,并且我可以通过它反向传播错误。
权重函数:
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:所有张量流操作是否可区分?
答案 0 :(得分:1)
因此,我遵循@DomJack的建议,删除了tf.convert_to_tensor调用,并进行了一些小小的打扫。 现在功能是可微的。
y