Tensorflow:如何通过索引获取张量值并分配新值

Tensorflow:如何通过索引获取张量值并分配新值,tensorflow,keras,Tensorflow,Keras,我试图对Tensorflow中张量的Topk值做一些运算。基本上,我想要的是首先得到K值的索引,做一些运算并分配新的值。例如: A = tf.constant([[1,2,3,4,5],[6,7,8,9,10]]) values, indices = tf.nn.top_k(A, k=3) 在这里,值将是数组([[5,4,3],[10,9,8]],dtype=int32) 在我对值执行一些操作之后,比如prob=tf.nn.softmax(值),我应该如何根据索引将该值分配给A?这类似于num

我试图对Tensorflow中张量的Topk值做一些运算。基本上,我想要的是首先得到K值的索引,做一些运算并分配新的值。例如:

A = tf.constant([[1,2,3,4,5],[6,7,8,9,10]])
values, indices = tf.nn.top_k(A, k=3)
在这里,值将是数组([[5,4,3],[10,9,8]],dtype=int32)


在我对值执行一些操作之后,比如prob=tf.nn.softmax(值),我应该如何根据索引将该值分配给A?这类似于numpy A[index]=prob。似乎在tensorflow中找不到正确的函数来实现这一点。

不幸的是,tensorflow在你想使用张量索引时非常痛苦,所以要实现你的想法,你必须使用一些难看的变通方法。我的选择是:

将tensorflow导入为tf
#首先,最好使用变量,因为常量不是为更新而设计的
A=tf.变量(初始值=[[1,2,3,4,5],[6,7,8,9,10])
#创建一个缓冲区变量,用于存储临时更新,
#用随机值初始化它
t=tf.Variable(初始值=tf.cast(tf.random\u normal(shape=[5]),dtype=tf.int32))
数值,指数=tf.nn.top_k(A,k=3)
#创建一个函数,用于对所需的值进行操作
def val_操纵(v):
返回2*v+1
#创建一个while循环来更新one be one的每个条目,
#因为“分散”和“更新”只能通过切片进行更新,而不能通过单个条目进行更新
i=tf.常数(0)
#每片更新一次停止
c=λi,x:tf.less(i,tf.shape(A)[0])
#每次迭代更新i和
#用更新的切片更新A(A[i])的每个切片
b=lambda i,x:[i+1,tf.散射和更新(A,[[i]],[tf.散射更新(tf.分配(t,A[i]),索引[i],值处理(值[i])]]
#While循环
r=tf.while_循环(c,b,[i,A])
初始化所有变量()
将tf.Session()作为s:
s、 运行(初始化)
#试试看!
打印s.run(A)
s、 运行(r)
打印s.run(A)
所以基本上你要做的是:

  • scatter\u update
    只能处理变量,因此我们从a(作为[i])中提取一个切片,并将这些值存储到缓冲变量
    t
  • 使用所需值更新缓冲区变量中的值
  • 用更新的
    t
  • 重复
    A
  • 最终,您应该得到以下输出:

    [[1 2 3 4 5][6 7 8 9 10]]
    [[ 1  2  7  9 11]  [ 6  7 17 19 21]]
    
    不能更改
    常量的数组的值。