def testDirectUseOverlapping(self):
     for num_batches in [1, 3]:
         for row_window_size in [2, 5]:
             for col_window_size in [2, 4]:
                 num_rows = (row_window_size - 1) * 5 + 1
                 num_cols = (col_window_size - 1) * 7 + 1
                 for num_channels in [1, 2]:
                     input_shape = (num_batches, num_rows, num_cols,
                                    num_channels)
                     with self.test_session() as _:
                         input_tensor = tf.constant(
                             self._GenerateRandomInputTensor(
                                 input_shape).astype(np.float32))
                         window_size = [
                             1, row_window_size, col_window_size, 1
                         ]
                         stride_size = [
                             1, row_window_size - 1, col_window_size - 1, 1
                         ]
                         padding = "VALID"
                         output_tensor = tf.nn.avg_pool(
                             input_tensor, window_size, stride_size,
                             padding)
                         output_data = output_tensor.eval()
                         num_elements = 1
                         for dim_size in output_data.shape:
                             num_elements *= dim_size
                         output_backprop = (self._PRNG.rand(num_elements) *
                                            1000).reshape(output_data.shape)
                         input_backprop_tensor = gen_nn_ops._avg_pool_grad(
                             input_tensor.get_shape(), output_backprop,
                             window_size, stride_size, padding)
                         input_backprop = input_backprop_tensor.eval()
                         row_seq = list(
                             range(0, num_rows, row_window_size - 1))
                         col_seq = list(
                             range(0, num_cols, col_window_size - 1))
                         row_seq[-1] += 1
                         col_seq[-1] += 1
                         fap_input_backprop_tensor = gen_nn_ops._fractional_avg_pool_grad(
                             input_tensor.get_shape(),
                             output_backprop,
                             row_seq,
                             col_seq,
                             overlapping=True)
                         fap_input_backprop = fap_input_backprop_tensor.eval(
                         )
                         self.assertShapeEqual(input_backprop,
                                               fap_input_backprop_tensor)
                         self.assertAllClose(input_backprop,
                                             fap_input_backprop)
Esempio n. 2
0
def _FractionalAvgPoolGrad(op, grad_0, unused_grad_1, unused_grad_2):
  """Returns gradient for FractionalAvgPool.

  Since FractionalAvgPool has three outputs, there are three gradients passed in
  for each of the outputs. Only the first one is useful, the other two gradients
  are empty.

  Args:
    op: The FractionalAvgPoolOp.
    grad_0: Gradient with respect to op.outputs[0]
    unused_grad_1: Gradient with respect to op.outputs[1]/row_seq. It is empty.
    unused_grad_2: Gradient with respect to op.outputs[2]/col_seq. It is empty.

  Returns:
    Input backprop for FractionalAvgPool op.
  """
  # pylint: disable=protected-access
  return gen_nn_ops._fractional_avg_pool_grad(op.inputs[0].get_shape(), grad_0,
                                              op.outputs[1], op.outputs[2],
                                              op.get_attr("overlapping"))
 def testDirectUseOverlapping(self):
   for num_batches in [1, 3]:
     for row_window_size in [2, 5]:
       for col_window_size in [2, 4]:
         num_rows = (row_window_size - 1) * 5 + 1
         num_cols = (col_window_size - 1) * 7 + 1
         for num_channels in [1, 2]:
           input_shape = (num_batches, num_rows, num_cols, num_channels)
           with self.test_session() as _:
             input_tensor = constant_op.constant(
                 self._GenerateRandomInputTensor(input_shape).astype(
                     np.float32))
             window_size = [1, row_window_size, col_window_size, 1]
             stride_size = [1, row_window_size - 1, col_window_size - 1, 1]
             padding = "VALID"
             output_tensor = nn_ops.avg_pool(input_tensor, window_size,
                                             stride_size, padding)
             output_data = output_tensor.eval()
             num_elements = 1
             for dim_size in output_data.shape:
               num_elements *= dim_size
             output_backprop = (self._PRNG.rand(num_elements) *
                                1000).reshape(output_data.shape)
             input_backprop_tensor = gen_nn_ops._avg_pool_grad(
                 input_tensor.get_shape(), output_backprop, window_size,
                 stride_size, padding)
             input_backprop = input_backprop_tensor.eval()
             row_seq = list(range(0, num_rows, row_window_size - 1))
             col_seq = list(range(0, num_cols, col_window_size - 1))
             row_seq[-1] += 1
             col_seq[-1] += 1
             fap_input_backprop_tensor = gen_nn_ops._fractional_avg_pool_grad(
                 input_tensor.get_shape(),
                 output_backprop,
                 row_seq,
                 col_seq,
                 overlapping=True)
             fap_input_backprop = fap_input_backprop_tensor.eval()
             self.assertShapeEqual(input_backprop, fap_input_backprop_tensor)
             self.assertAllClose(input_backprop, fap_input_backprop)