发新帖

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

[复制链接]
903 4

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

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

我知道答案 回答被采纳将会获得10 金币 + 15 金币 已有4人回答
本楼点评(0) 收起

精彩评论4

TianLin  TF荚荚  发表于 2018-4-18 13:52:41 | 显示全部楼层
TensorFlow 计算图是根据需要更新的,你需要把相应更新的节点都放入sess.run(fetches, ...)列表中。

  1. inputs = tf.placeholder(tf.float32, shape=[None, 3])
  2. values, indicies = tf.nn.top_k(inputs, k=2)
  3. print sess.run([values, indicies], feed_dict={inputs: [[1,2,3], [4,5,6]]})
复制代码
本楼点评(0) 收起
xxyun_yun  TF荚荚  发表于 2018-4-18 14:33:01 | 显示全部楼层
TianLin 发表于 2018-4-18 13:52
TensorFlow 计算图是根据需要更新的,你需要把相应更新的节点都放入sess.run(fetches, ...)列表中。

...

谢谢回复,我试过了还是不行。我将这个索引写到了sess.run()里面,还是和之前有一样的错。我觉得是因为,我定义损失函数的时候用的预测值中没有用到前面定义的权重,所以一直报ValueError: None values not supported.。看到有人说单用索引是没有梯度的,也有可能吧
本楼点评(0) 收起
AirLRJ  TF荚荚  发表于 2018-4-18 17:57:42 | 显示全部楼层
您可以具体说下您的需求吗?

我的理解是您
1,对1班学生成绩做topk拿到1班学生高分的位置
2,然后套到2班学生上,
3,拿到2班学生对应位置的平均成绩和一个标准比(算loss function)
4,然后要求原来的1班学生对应提高成绩? (back propagation 到1班)
本楼点评(1) 收起
  • xxyun_yun意思差不多,只不过1、2班是有联系的。相当于用一个数据经过一些变换,求得了一班最高分位置,然后将这些位置映射到最开始的那个数据上,再对这些数据做后续的计算,获取loss function
    2018-4-18 19:31 回复
little1tow  TF荚荚  发表于 2018-8-7 23:29:59 | 显示全部楼层
我也遇到了同样的问题,但我分析后发现,如果使用的是索引值,那么在梯度回传的时候,这个地方是不可导的,那在tenforflow里经过这里的梯度就变成0了,不管怎么更新,他都是0,那么他之前的就无法更新了,也就没有什么用了,但如何解决,目前我也还在尝试中
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表