Matriz dispersa de un denso Tensorflow

Estoy creando un codificador automático escaso convolucional y necesito convertir una matriz 4D llena de valores (cuya forma es [samples, N, N, D] ) en una matriz dispersa.

Para cada muestra, tengo D NxN mapas de características. Quiero convertir cada mapa de características NxN a una matriz dispersa, con el valor máximo asignado a 1 y todos los demás a 0.

No quiero hacer esto en tiempo de ejecución, pero durante la statement de Gráfico (porque necesito usar la matriz dispersa resultante como entrada para otras operaciones de gráfico), pero no entiendo cómo obtener los índices para construir la matriz dispersa.

Puedes usar tf.where y tf.gather_nd para hacer eso:

 import numpy as np import tensorflow as tf # Make a tensor from a constant a = np.reshape(np.arange(24), (3, 4, 2)) a_t = tf.constant(a) # Find indices where the tensor is not zero idx = tf.where(tf.not_equal(a_t, 0)) # Make the sparse tensor # Use tf.shape(a_t, out_type=tf.int64) instead of a_t.get_shape() # if tensor shape is dynamic sparse = tf.SparseTensor(idx, tf.gather_nd(a_t, idx), a_t.get_shape()) # Make a dense tensor back from the sparse one, only to check result is correct dense = tf.sparse_tensor_to_dense(sparse) # Check result with tf.Session() as sess: b = sess.run(dense) np.all(a == b) >>> True 

Código simple para convertir una matriz numpy densa a tf.SparseTensor:

 def denseNDArrayToSparseTensor(arr): idx = np.where(arr != 0.0) return tf.SparseTensor(np.vstack(idx).T, arr[idx], arr.shape)