python - neural - TensorFlow-indexación de tensor tipo numpy
tensorflow neural network (3)
En numpy, podemos hacer esto:
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
Cuando intento algo equivalente en TensorFlow:
xt = tf.constant(x)
at = tf.constant(a)
bt = tf.constant(b)
xt[at,bt]
La última línea da una excepción de "Tensor de índice de corte incorrecto". Parece que TensorFlow no admite indexación como numpy o Theano.
¿Alguien sabe si hay una manera de hacer esto TensorFlow (indexando un tensor por valores arbitrarios)? He visto la parte de incrustación tf.nn.e pero no estoy seguro de que puedan usarse para esto e incluso si pueden, es una gran solución para algo tan sencillo.
(En este momento, estoy alimentando los datos de
x
como una entrada y haciendo la indexación en numpy, pero esperaba poner
x
dentro de TensorFlow para obtener una mayor eficiencia)
De hecho, puede hacerlo ahora con
tf.gather_nd
.
Digamos que tiene una matriz
m
como la siguiente:
| 1 2 3 4 |
| 5 6 7 8 |
Y desea construir una matriz
r
de tamaño, digamos, 3x2, construida a partir de elementos de
m
, como este:
| 3 6 |
| 2 7 |
| 5 3 |
| 1 1 |
Cada elemento de
r
corresponde a una fila y columna de
m
, y puede tener matrices de
rows
y
cols
con estos índices (basados en cero, ya que estamos programando, ¡no haciendo matemáticas!):
| 0 1 | | 2 1 |
rows = | 0 1 | cols = | 1 2 |
| 1 0 | | 0 2 |
| 0 0 | | 0 0 |
Que puedes apilar en un tensor tridimensional como este:
| | 0 2 | | 1 1 | |
| | 0 1 | | 1 2 | |
| | 1 0 | | 2 0 | |
| | 0 0 | | 0 0 | |
De esta manera, puede pasar de
m
a
r
través de
rows
y
cols
siguiente manera:
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)
Salida:
[[ 3. 6.]
[ 2. 7.]
[ 5. 3.]
[ 1. 1.]]
El comentario de LDGN es correcto. Por el momento, esto no es posible y es una característica solicitada. Si sigues el github.com/tensorflow/tensorflow/issues/206 , recibirás actualizaciones si está disponible. A muchas personas les gustaría esta característica.
Para
Tensorflow 0.11
, se ha implementado la indexación básica.
Todavía falta la indexación más avanzada (como la indexación booleana), pero aparentemente está prevista para futuras versiones.
La indexación avanzada se puede rastrear con https://github.com/tensorflow/tensorflow/issues/4638