¿Cuál es la mejor manera de superar k elementos de pool en lugar de solo el máximo en Tensorflow?

Ahora la función de agrupación máxima en tensorflow es

 tf.nn.max_pool (value, ksize, strides, padding, name = None)
 Devoluciones:
 Un tensor con el tipo tf.float32.  El máximo tensor de salida agrupada.

Me gustaría tener una versión extendida de max_pool, como

 tf.nn.top_k_pool (valor, ksize, strides, padding, k = 1, name = None)

 Realiza la agrupación de k superior en la entrada.

 Args:

 valor: un tensor 4-D con forma [lote, altura, ancho, canales] y tipo tf.float32.
 ksize: una lista de entradas que tiene longitud> = 4. El tamaño de la ventana para cada dimensión del tensor de entrada.
 zancadas: una lista de entradas que tiene una longitud> = 4. La zancada de la ventana deslizante para cada dimensión del tensor de entrada.
 relleno: una cadena, ya sea 'VÁLIDA' o 'MISMO'.  El algoritmo de relleno.
 k: 0-d int32 tensor.  Número de elementos superiores a buscar en cada grupo.
 Nombre: Nombre opcional para la operación.
 Devoluciones:

 Un tensor con el tipo tf.float32.  El máximo tensor de salida agrupada.  Habrá una dimensión adicional guardando los valores k superiores.

Sé que puedo gastar la operación de tensorflow siguiendo https://www.tensorflow.org/versions/r0.7/how_tos/adding_an_op/index.html

Me gustaría saber si hay una manera más fácil de lograrlo.

Aquí hay una función para usar top_k para tomar el máximo de k activaciones de los canales. Puedes modificarlo para que se ajuste a tu propósito:

 def make_sparse_layer(inp_x,k, batch_size=None): in_shape = tf.shape(inp_x) d = inp_x.get_shape().as_list()[-1] matrix_in = tf.reshape(inp_x, [-1,d]) values, indices = tf.nn.top_k(matrix_in, k=k, sorted=False) out = [] vals = tf.unpack(values, axis=0, num=batch_size) inds = tf.unpack(indices, axis=0, num=batch_size) for i, idx in enumerate(inds): out.append(tf.sparse_tensor_to_dense(tf.SparseTensor(tf.reshape(tf.cast(idx,tf.int64),[-1,1]),vals[i], [d]), validate_indices=False )) shaped_out = tf.reshape(tf.pack(out), in_shape) return shaped_out 

Su mejor apuesta es probablemente la operación TopK: https://www.tensorflow.org/versions/r0.7/api_docs/python/nn.html#top_k

usd tf.reshape (), tf.matrix_transpose (), tf.nn.top_k (ordenado = Falso) y el argumento ‘data_format’ en tf.nn.conv2d (), visite http://www.infocool.net/ kb / OtherCloud / 201703 / 318346.html para más detalles