1

我的印象是所有 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:所有的张量流操作都是可微的吗?

4

1 回答 1

1

所以我听从了@DomJack 的建议,删除了 tf.convert_to_tensor 调用,并一路打扫了一些房子。现在函数是可微的。

def ranked(a):
    rankw01  = tf.cast(tf.contrib.framework.argsort(tf.contrib.framework.argsort(a)) + 1, tf.float32)
    rankw02  = rankw01 - tf.cast((tf.shape(a)[-1] + 1)/2, tf.float32)
    rankw03  = tf.div(rankw02, tf.reduce_sum(tf.nn.relu(rankw02), axis = -1, keepdims=True))

    return rankw033
于 2018-08-25T08:29:04.360 回答