2016-06-07 26 views
7

Desidero assegnare valori in un tensore in base agli indici.In Tensorflow, come assegnare valori nel Tensore in base agli indici?

Ad esempio, In base ai valori di raggruppamento e all'uscita degli indici corrispondenti di tf.nn.max_pool_with_argmax, voglio riportare questi valori di pool nel tensore originale con gli indici.

Trovo che gli indici di uscita di tf.nn.max_pool_with_argmax siano appiattiti. Una domanda: come risolverli nelle coordinate di Tensorflow?

Un'altra domanda: come assegnare ciascun valore del tensore di raggruppamento alla posizione del tensore di dislocamento originale in Tensorflow, dati gli indici?

Grazie mille.

Ho provato a fare i codici per ottenere ciò, ma posso semplicemente usare numpy. Non so come ottenere gli indici appiattiti dopo lo tf.nn.max_pool_with_argmax e l'assegnazione al tensore di distanza a Tensorflow.

ksize = 3 
stride = 1 

input_image = tf.placeholder(tf.float32, name='input_image') 

#conv1 
kernel = tf.Variable(tf.truncated_normal([ksize, ksize, 3, 16],stddev=0.1), 
        name='kernel') 
conv = tf.nn.conv2d(input_image, kernel, [1,stride,stride,1], padding='SAME') 
biases = tf.Variable(tf.constant(0.0, shape = [16]), name = 'biases') 
bias = tf.nn.bias_add(conv, biases) 
conv1 = tf.nn.relu(bias, name='conv1') 

#pool1 
pool1, pool1_indices = tf.nn.max_pool_with_argmax(conv1, ksize=[1, 2, 2, 1], 
                strides=[1, 2, 2, 1], 
                padding='SAME', name='pool1') 

#upsample by assigning the values of pool1 to the position in unpooling Tensor according to pool1_indices             
indices = pool1_indices 
unravel_pool1_indices = np.unravel_index(indices,[4,32,32,16]) 
unravel_pool1_coordinates = np.array(unravel_pool1_indices) 
coor_shape = np.shape(unravel_pool1_coordinates) 
unravel_pool1_coordinates = np.reshape(unravel_pool1_coordinates,(coor_shape[0],coor_shape[1]*coor_shape[2]*coor_shape[3]*coor_shape[4])) 
unravel_pool1_coordinates = unravel_pool1_coordinates.T 

values = pool1 
values = np.reshape(values,(np.size(values))) 

up1 = tf.constant(0.0, shape = [4,32,32,16]) 
delta = tf.SparseTensor(unravel_pool1_coordinates, values, shape = [4,32,32,16]) 

result = up1 + tf.sparse_tensor_to_dense(delta) 


with tf.Session() as session: 
    session.run(tf.initialize_all_variables()) 
    test_image = np.random.rand(4,32,32,3) 
    sess_outputs = session.run([pool1, pool1_indices], 
           {input_image.name: test_image}) 
+1

Se siete ancora alla ricerca di una soluzione, si potrebbe verificare questo: http://stackoverflow.com/questions/34685947/adjust-single-value-within-tensor-tensorflow/34686952#34686952][1] –

risposta

0

C'è un PR in attesa che dovrebbe risolvere il problema:

https://github.com/tensorflow/tensorflow/issues/1793

+1

Grazie. Ho controllato il problema. È come calcolare la sfumatura di max_pool_with_argmax op. Ma qui, voglio assegnare i valori in un grande tensore secondo gli indici. La parte centrale del codice che ho scritto con Numpy, sembra che non può essere costruita con il grafico. Come raggiungerlo a Tensorflow? –

Problemi correlati