如何使用tf.gather_nd在tensorflow中切片张量?

时间:2018-12-07 19:37:03

标签: python tensorflow

我在numpy中寻找以下代码的张量流等效项。给出了 findViewById(R.id.countTouch).setOnTouchListener(new OnTouchListnere{ public boolean onTouch(MotionEvent e){ if(e.getAction()==MotionEvent.ACTION_DOWN){ counter++; // increment your global counter variable //Log screen touched } return false; } }; a。目标是构造idx_2

b

我尝试直接索引张量并使用# A float Tensor obtained somehow a = np.arange(3*5).reshape(3,5) # An int Tensor obtained somehow idx_2 = np.array([[1,2,3,4],[0,2,3,4],[0,2,3,4]]) # An int Tensor, constructed for indexing idx_1 = np.arange(a.shape[0]).reshape(-1,1) # The goal b = a[idx_1, idx_2] print(b) >>> [[ 1 2 3 4] [ 5 7 8 9] [10 12 13 14]] ,但是我一直遇到错误,因此我决定在这里问如何做。我到处都在寻找答案,人们使用tf.gather_nd(因此有标题)来解决类似的问题,但是要应用此功能,我必须以某种方式重塑索引,以便可以将它们用于切片第一维。我该怎么做呢?请帮忙。

1 个答案:

答案 0 :(得分:0)

在NumPy中非常简单和Pythonic的事情中,Tensorflow可能很难看。这是我使用tf.gather_nd在TensorFlow中重新创建问题的方式。不过,可能还有更好的方法。

import tensorflow as tf
import numpy as np

with tf.Session() as sess:
    # Define 'a'
    a = tf.reshape(tf.range(15),(3,5))
    # Define both index tensors 
    idx_1 = tf.reshape(tf.range(a.get_shape().as_list()[0]),(-1,1)).eval()
    idx_2 = tf.constant([[1,2,3,4],[0,2,3,4],[0,2,3,4]]).eval()
    # get indices for use with gather_nd
    gather_idx = tf.constant([(x[0],y) for (i,x) in enumerate(idx_1) for y in idx_2[i]])
    # extract elements and reshape to desired dimensions
    b = tf.gather_nd(a, gather_idx)
    b = tf.reshape(b,(idx_1.shape[0], idx_2.shape[1]))
    print(sess.run(b))

[[ 1  2  3  4]
[ 5  7  8  9]
[10 12 13 14]]