2016-04-25 25 views
7

Sto tentando di implementare qualcosa come una rete completamente convoluzionale, in cui l'ultimo strato di convoluzione utilizza la dimensione del filtro 1x1 e genera un tensore di 'punteggio'. Il tensore del punteggio ha forma [Batch, height, width, num_classes].Per pixel softmax per rete completamente convoluzionale

La mia domanda è, quale funzione in tensorflow può applicare l'operazione softmax per ogni pixel, indipendentemente da altri pixel. Le operazioni di tf.nn.softmax non sembrano per questo scopo.

Se non sono disponibili tali ops, credo di doverne scrivere uno da solo.

Grazie!

AGGIORNAMENTO: se devo implementare me stesso, penso che potrebbe essere necessario rimodellare il tensore di ingresso su [N, num_claees] dove N = Larghezza x larghezza x x, e applicare tf.nn.softmax, quindi rimodellare indietro. Ha senso?

+0

È possibile ridisegnarlo a una matrice 2d, eseguire softmax, quindi riconfigurare. – Aaron

+0

Aha, aggiorna contemporaneamente con i tuoi commenti. Ma grazie! –

+0

hey, hai finalmente implementato questo? Sono bloccato qui. –

risposta

3

Rimodellarlo in 2d e quindi rimodellarlo indietro, come hai indovinato, è l'approccio giusto.

1

È possibile utilizzare questa funzione.

L'ho trovato cercando da GitHub.

import tensorflow as tf 

""" 
Multi dimensional softmax, 
refer to https://github.com/tensorflow/tensorflow/issues/210 
compute softmax along the dimension of target 
the native softmax only supports batch_size x dimension 
""" 
def softmax(target, axis, name=None): 
    with tf.name_scope(name, 'softmax', values=[target]): 
     max_axis = tf.reduce_max(target, axis, keep_dims=True) 
     target_exp = tf.exp(target-max_axis) 
     normalize = tf.reduce_sum(target_exp, axis, keep_dims=True) 
     softmax = target_exp/normalize 
     return softmax