tf.nn.top_k 函数只提取前 k 个索引做后面的工作,权重不会更...

tf.nn.top_k 函数可获取张量的前 k 个最大值,有两个输出,一个是前 k 个的值,另一个是前 k 个的索引。我需要的是提取一下张量的索引(这个张量也是训练求得的,涉及权重一类的,不是固定的),然后根据索引映射提取其他张量进行后续工作。
但是我发现,要是只提取 top_k 的第二个输出即索引的话,我前面定义的那些权重都是没有用的(训练的时候不会更新);如果提取的是 top_k 的第一个输出(即值)那些权重是会更新的。
然而我需要的是索引,不是值。这个问题要怎么解决呀!
我是觉得索引也是根据值的大小确定的,为什么这些权重不会更新呀,有什么其他方法可实现这个功能吗?


提问人: xxyun_yun,2018-4-18 09:43:18

TensorFlow 计算图是根据需要更新的,你需要把相应更新的节点都放入 sess.run (fetches, …) 列表中。

inputs = tf.placeholder (tf.float32, shape=[None, 3])
values, indicies = tf.nn.top_k (inputs, k=2)
print sess.run ([values, indicies], feed_dict={inputs: [[1,2,3], [4,5,6]]})

TianLin,发表于 2018-4-18 13:52:41

谢谢回复,我试过了还是不行。我将这个索引写到了 sess.run () 里面,还是和之前有一样的错。我觉得是因为,我定义损失函数的时候用的预测值中没有用到前面定义的权重,所以一直报 ValueError: None values not supported.。看到有人说单用索引是没有梯度的,也有可能吧


xxyun_yun(提问者),发表于 2018-4-18 14:33:01

您可以具体说下您的需求吗?

我的理解是您
1,对 1 班学生成绩做 topk 拿到 1 班学生高分的位置
2,然后套到 2 班学生上,
3,拿到 2 班学生对应位置的平均成绩和一个标准比(算 loss function)
4,然后要求原来的 1 班学生对应提高成绩? (back propagation 到 1 班)


AirLRJ,发表于 2018-4-18 17:57:42

意思差不多,只不过 1、2 班是有联系的。相当于用一个数据经过一些变换,求得了一班最高分位置,然后将这些位置映射到最开始的那个数据上,再对这些数据做后续的计算,获取 loss function


xxyun_yun(提问者),2018-4-18 19:31

我也遇到了同样的问题,但我分析后发现,如果使用的是索引值,那么在梯度回传的时候,这个地方是不可导的,那在 tenforflow 里经过这里的梯度就变成 0 了,不管怎么更新,他都是 0,那么他之前的就无法更新了,也就没有什么用了,但如何解决,目前我也还在尝试中。


little1tow,发表于 2018-8-7 23:29:59