title: In Tensorflow, how to assign values in Tensor according to the indices?
body: <p>I want to assign values in a tensor according to the indices.</p>
  
  <p>For example,
  According to the pooling values and the corresponding indices output of <a href="https://www.tensorflow.org/versions/r0.9/api_docs/python/nn.html#max_pool_with_argmax">tf.nn.max_pool_with_argmax</a>, I want to put these pooling values back into the original unpooling Tensor with the indices.</p>
  
  <p>I find the output indices of <code>tf.nn.max_pool_with_argmax</code> is flattened.
  One question: How to unravel them back into the coordinates in Tensorflow?</p>
  
  <p>Another question: How to assign each value of the pooling tensor to the position of the original unpooling tensor in Tensorflow, given the indices?</p>
  
  <p>Thank you very much.</p>
  
  <p>I tried to make the codes to achieve that, but I can just use <code>numpy</code>. I do not how to obtain the flattened indices after the <code>tf.nn.max_pool_with_argmax</code> and assigning into the unpooling tensor in Tensorflow.</p>
  
  <pre><code>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})
  </code></pre>