2016-06-07 18 views
7

Chcę przypisać wartości w tensorze zgodnie z indeksami.W Tensorflow, jak przypisać wartości w Tensor według indeksów?

Na przykład Zgodnie z wartościami pulowania i odpowiadającymi im wartościami wyjściowymi z tf.nn.max_pool_with_argmax, chcę umieścić te wartości łączenia z powrotem w oryginalnym tensorze nie łączącym z indeksami.

Uważam, że indeksy wyjściowe tf.nn.max_pool_with_argmax są spłaszczone. Jedno pytanie: jak rozłożyć je z powrotem na współrzędne w Tensorflow?

Kolejne pytanie: Jak przypisać każdą wartość tensora puli do pozycji oryginalnego tensora nie łączącego w Tensorflow, biorąc pod uwagę indeksy?

Dziękuję bardzo.

Próbowałem zrobić kody, aby to osiągnąć, ale mogę po prostu użyć numpy. Nie wiem, jak uzyskać spłaszczone wskaźniki po tf.nn.max_pool_with_argmax i przypisać do tensora nie łączącego w 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

Jeśli nadal szuka rozwiązania, można to sprawdzić: http://stackoverflow.com/questions/34685947/adjust-single-value-within-tensor-tensorflow/34686952#34686952][] –

Odpowiedz

0

Tam czeka PR, które powinny rozwiązać ten problem:

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

+1

Dziękuję. Sprawdziłem ten problem. Oto jak obliczyć gradient max_pool_with_argmax op. Ale tutaj, chcę przypisać wartości w dużej Tensor zgodnie z indeksami. Środkowa część kodu, którą napisałem z numpy, Wydaje się, że nie można go zbudować za pomocą wykresu. Jak to osiągnąć w Tensorflow? –

Powiązane problemy