2015-11-16 4 views
19

В NumPy, мы можем сделать это:TensorFlow - NumPy подобный тензор индексации

x = np.random.random((10,10)) 
a = np.random.randint(0,10,5) 
b = np.random.randint(0,10,5) 
x[a,b] # gives 5 entries from x, indexed according to the corresponding entries in a and b 

Когда я пытаюсь что-то эквивалент в TensorFlow:

xt = tf.constant(x) 
at = tf.constant(a) 
bt = tf.constant(b) 
xt[at,bt] 

В последней строке «Плохой тензор индекса среза исключение. Кажется, TensorFlow не поддерживает индексирование, как numpy или Theano.

Кто-нибудь знает, существует ли способ TensorFlow (индексирование тензора произвольными значениями). Я видел часть tf.nn.embedding, но я не уверен, что они могут быть использованы для этого, и даже если это возможно, это огромное решение для чего-то такого простого.

(Прямо сейчас, я кормлю данные из x в качестве входных данных и делать индексацию в NumPy, но я надеялся поставить x внутри TensorFlow, чтобы получить более высокую эффективность) комментарий

+2

эта проблема, похоже, касается именно этого: https://github.com/tensorflow/tensorflow/issues/206 – LDGN

ответ

8

LDGN является правильным. Это невозможно в данный момент и является запрошенной функцией. Если вы последуете за issue#206 on github, вы будете обновлены, если/когда это будет доступно. Многие люди хотели бы эту функцию.

1

Для tf 0.11 выполнено базовое индексирование. Более продвинутое индексирование (например, булевское индексирование) по-прежнему отсутствует, но, по-видимому, планируется для версий futur.

Расширенный индексации можно отслеживать с https://github.com/tensorflow/tensorflow/issues/4638

7

Вы действительно можете сделать это сейчас с tf.gather_nd. Скажем, у вас есть матрица m вроде следующего:

| 1 2 3 4 | 
| 5 6 7 8 | 

И вы хотите, чтобы построить матрицу r размера, скажем, 3x2, построенный из элементов m, как это:

| 3 6 | 
| 2 7 | 
| 5 3 | 
| 1 1 | 

Каждый элемент r соответствует строке и столбцу m, и вы можете иметь матрицы rows и cols с этими индексами (с нулевым основанием, поскольку мы программируем, а не занимаемся математикой!):

 | 0 1 |   | 2 1 | 
rows = | 0 1 | cols = | 1 2 | 
     | 1 0 |   | 0 2 | 
     | 0 0 |   | 0 0 | 

Что вы можете сложить в 3-мерном тензором, как это:

| | 0 2 | | 1 1 | | 
| | 0 1 | | 1 2 | | 
| | 1 0 | | 2 0 | | 
| | 0 0 | | 0 0 | | 

Таким образом, вы можете получить от m к r через rows и cols следующим образом:

import numpy as np 
import tensorflow as tf 

m = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) 
rows = np.array([[0, 1], [0, 1], [1, 0], [0, 0]]) 
cols = np.array([[2, 1], [1, 2], [0, 2], [0, 0]]) 

x = tf.placeholder('float32', (None, None)) 
idx1 = tf.placeholder('int32', (None, None)) 
idx2 = tf.placeholder('int32', (None, None)) 
result = tf.gather_nd(x, tf.stack((idx1, idx2), -1)) 

with tf.Session() as sess: 
    r = sess.run(result, feed_dict={ 
     x: m, 
     idx1: rows, 
     idx2: cols, 
    }) 
print(r) 

Выход:

[[ 3. 6.] 
[ 2. 7.] 
[ 5. 3.] 
[ 1. 1.]] 
+0

Не могли бы вы немного объяснить, что делает этот код? –

+0

@Mr_and_Mrs_D Ну, точная спецификация того, что 'tf.gather_nd' немного сложна, вы можете проверить это в документах. Но в принципе, идея в том, что я хочу, чтобы матрица 'result', скажем, MxN, составляла каждый элемент из другой матрицы' x'. Для каждого элемента у меня есть соответствующая строка и столбец 'x'; это 'idx1' и' idx2'.Я складываю эти два, чтобы получить тензор MxNx2, назовем его 'idx12'. 'tf.gather_nd' использует последнее измерение' idx12' (которое имеет размер 2, например, количество измерений в 'x'), для создания двумерных индексов, которые используются для поиска элементов, которые входят в' result' , – jdehesa

+0

Пожалуйста, добавьте их в свой ответ rand. Я продолжу - docs, ugh, несколько не хватает. Вы все равно должны объяснить, что отношение MxN к idx1/2 –

Смежные вопросы