tensorflow索引是如何工作的

tensorflow索引是如何工作的,tensorflow,Tensorflow,我很难理解tensorflow的基本概念。张量读/写操作的索引是如何工作的?为了使这一点具体化,如何使用所分配数组、索引和值的张量将以下numpy示例转换为tensorflow: x = np.zeros((3, 4)) row_indices = np.array([1, 1, 2]) col_indices = np.array([0, 2, 3]) x[row_indices, col_indices] = 2 x 输出: array([[ 0., 0., 0., 0.],

我很难理解tensorflow的基本概念。张量读/写操作的索引是如何工作的?为了使这一点具体化,如何使用所分配数组、索引和值的张量将以下numpy示例转换为tensorflow:

x = np.zeros((3, 4))
row_indices = np.array([1, 1, 2])
col_indices = np.array([0, 2, 3])
x[row_indices, col_indices] = 2
x
输出:

array([[ 0.,  0.,  0.,  0.],
       [ 2.,  0.,  2.,  0.],
       [ 0.,  0.,  0.,  2.]])
array([[ 0.,  0.,  0.,  0.],
       [ 5.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  3.]])
array([ 5.,  4.,  3.])
。。。而且

x[row_indices, col_indices] = np.array([5, 4, 3])
x
输出:

array([[ 0.,  0.,  0.,  0.],
       [ 2.,  0.,  2.,  0.],
       [ 0.,  0.,  0.,  2.]])
array([[ 0.,  0.,  0.,  0.],
       [ 5.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  3.]])
array([ 5.,  4.,  3.])
。。。最后

y = x[row_indices, col_indices]
y
输出:

array([[ 0.,  0.,  0.,  0.],
       [ 2.,  0.,  2.,  0.],
       [ 0.,  0.,  0.,  2.]])
array([[ 0.,  0.,  0.,  0.],
       [ 5.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  3.]])
array([ 5.,  4.,  3.])
github有一个问题可以很好地支持这一点,同时您必须求助于详细的解决方法

第一个示例可以使用tf.select完成,它通过从一个或另一个元素中选择每个元素来组合两个相同形状的张量

tf.reset\u默认图 行索引=tf.常数[1,1,2] col_指数=tf.常数[0,2,3] x=tf.zeros3,4 sess=tf.InteractiveSession 获取第1行、第1列、第2行、第2列的列表。。 coords=tf.transposetf.pack[行索引,列索引] 在第1行,第1列,。。。 二进制掩码=tf.sparse\u to\u densecoords,x.get\u shape,1 将1/0转换为真/假 二进制屏蔽=tf.castbinary屏蔽,tf.bool twos=2*tf.onesx.get_形状 根据蒙版,使用旧值或2生成新x x=tf.selectbinary\u mask,twos,x 打印x.eval 给予

[[ 0. 0. 0. 0.] [ 2. 0. 2. 0.] [ 0. 0. 0. 2.]] 第二种方法可以用scatter_update完成,除了scatter_update只支持线性索引和变量。因此,您可以创建一个临时变量,并像这样使用重塑。要避免变量,可以使用dynamic_stitch,请参见结尾

获取线性指数 线性指数=行指数*x.get\u形状[1]+列指数 将“x”转换为1d变量,因为“散布更新”仅支持线性索引 x_flat=tf.Variabletf.reformatex,[-1] 没有自动升级,所以要进行更新以匹配x updates=tf.constant[5,4,3],dtype=tf.float32 sess.runtf.initialize\u所有变量 sess.runtf.scatter\u updatex\u平面、线性索引、更新 转换回原始形状 x=tf.REGRAPEX_扁平,x.get_形状 打印x.eval 给予

[[ 0. 0. 0. 0.] [ 5. 0. 4. 0.] [ 0. 0. 0. 3.]] 最后,第三个示例已经得到了gather\n的支持

打印tf.gather\u ndx,coords.eval 得到

[ 5. 4. 3.] 5月6日,编辑

更新x[cols,rows]=newvals可以不使用在会话运行调用之间占用内存的变量来完成,方法是使用select with sparse_to_DENSACTION(获取稀疏值的向量)或依赖于动态_缝合

sess=tf.InteractiveSession x=tf.zeros3,4 行索引=tf.常数[1,1,2] col_指数=tf.常数[0,2,3] 没有自动升级,因此请指定浮点类型 替换值=tf.常数[5,4,3],数据类型=tf.float32 转换为行主格式的线性索引 线性指数=行指数*x.get\u形状[1]+列指数 x_flat=tf.reformaex,[-1] 使用动态缝合,它通过取值或 从array1[index1]或array2[index2],如果索引冲突, 使用后者 不变的指数=tf.rangetf.sizex\u平坦 改变的指数=线性指数 x_flat=tf.动态_针迹[未更改的_索引,更改的_索引], [x_平面,更换] x=tf.REGRAPEX_扁平,x.get_形状 打印x.eval
tensorflow不支持使用numpy执行的许多操作。看到这个问题,也许你可以解释更多你试图通过更新这些矩阵值来完成的事情,有人可以回答如何在tensorflow中实现这个结果。谢谢链接。我想尝试一些tensorflow库中尚未提供的图像增强功能,希望能够提高所学图像分类网络的通用性。我不需要梯度来通过这些操作,我可以在CPU上轻松完成,但这会成为一个巨大的性能瓶颈。我想我应该能够用雅罗斯拉夫的答案做我需要做的事情。这些例子非常有用。非常感谢。同事建议使用动态缝合代替变量,更新配方这仍然是最好的方法吗?