tensorflow

¿Cómo funciona la indexación de tensorflow?



(1)

Hay un problema con Github #206 para apoyar esto bien, mientras que tienes que recurrir a soluciones verbales

El primer ejemplo se puede hacer con tf.select que combina dos tensores de la misma forma seleccionando cada elemento de uno u otro

tf.reset_default_graph() row_indices = tf.constant([1, 1, 2]) col_indices = tf.constant([0, 2, 3]) x = tf.zeros((3, 4)) sess = tf.InteractiveSession() # get list of ((row1, col1), (row2, col2), ..) coords = tf.transpose(tf.pack([row_indices, col_indices])) # get tensor with 1''s at positions (row1, col1),... binary_mask = tf.sparse_to_dense(coords, x.get_shape(), 1) # convert 1/0 to True/False binary_mask = tf.cast(binary_mask, tf.bool) twos = 2*tf.ones(x.get_shape()) # make new x out of old values or 2, depending on mask x = tf.select(binary_mask, twos, x) print x.eval()

da

[[ 0. 0. 0. 0.] [ 2. 0. 2. 0.] [ 0. 0. 0. 2.]]

El segundo se podría hacer con scatter_update , excepto que scatter_update solo es compatible con índices lineales y funciona con variables. Así que podrías crear una variable temporal y usar la remodelación como esta. (Para evitar variables puedes usar dynamic_stitch , ve el final)

# get linear indices linear_indices = row_indices*x.get_shape()[1]+col_indices # turn ''x'' into 1d variable since "scatter_update" supports linear indexing only x_flat = tf.Variable(tf.reshape(x, [-1])) # no automatic promotion, so make updates float32 to match x updates = tf.constant([5, 4, 3], dtype=tf.float32) sess.run(tf.initialize_all_variables()) sess.run(tf.scatter_update(x_flat, linear_indices, updates)) # convert back into original shape x = tf.reshape(x_flat, x.get_shape()) print x.eval()

da

[[ 0. 0. 0. 0.] [ 5. 0. 4. 0.] [ 0. 0. 0. 3.]]

Finalmente el tercer ejemplo ya es compatible con gather_nd , tu escribes

print tf.gather_nd(x, coords).eval()

Llegar

[ 5. 4. 3.]

Editar, 6 de mayo

La actualización x[cols,rows]=newvals se puede hacer sin usar Variables (que ocupan la memoria entre las llamadas de ejecución de sesión) usando select con sparse_to_dense que toma el vector de valores dispersos, o confiando en dynamic_stitch

sess = tf.InteractiveSession() x = tf.zeros((3, 4)) row_indices = tf.constant([1, 1, 2]) col_indices = tf.constant([0, 2, 3]) # no automatic promotion, so specify float type replacement_vals = tf.constant([5, 4, 3], dtype=tf.float32) # convert to linear indexing in row-major form linear_indices = row_indices*x.get_shape()[1]+col_indices x_flat = tf.reshape(x, [-1]) # use dynamic stitch, it merges the array by taking value either # from array1[index1] or array2[index2], if indices conflict, # the later one is used unchanged_indices = tf.range(tf.size(x_flat)) changed_indices = linear_indices x_flat = tf.dynamic_stitch([unchanged_indices, changed_indices], [x_flat, replacement_vals]) x = tf.reshape(x_flat, x.get_shape()) print x.eval()

Estoy teniendo problemas para entender un concepto básico con tensorflow. ¿Cómo funciona la indexación para las operaciones de lectura / escritura de tensor? Para concretar esto, ¿cómo se pueden traducir los siguientes ejemplos numpy a tensorflow (utilizando tensores para las matrices, índices y valores que se asignan)?

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

con salida:

array([[ 0., 0., 0., 0.], [ 2., 0., 2., 0.], [ 0., 0., 0., 2.]])

... y ...

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

con salida:

array([[ 0., 0., 0., 0.], [ 5., 0., 4., 0.], [ 0., 0., 0., 3.]])

... y finalmente ...

y = x[row_indices, col_indices] y

con salida:

array([ 5., 4., 3.])