tutorial neural network mac instalar found for python tensorflow

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