Performs an N-D pooling operation.

In the case that data_format does not start with "NC", computes for 0 <= b < batch_size, 0 <= x[i] < output_spatial_shape[i], 0 <= c < num_channels:

  output[b, x[0], ..., x[N-1], c] =
    REDUCE_{z[0], ..., z[N-1]}
            x[0] * strides[0] - pad_before[0] + dilation_rate[0]*z[0],
            x[N-1]*strides[N-1] - pad_before[N-1] + dilation_rate[N-1]*z[N-1],

where the reduction function REDUCE depends on the value of pooling_type, and pad_before is defined based on the value of padding as described in the "returns" section of tf.nn.convolution for details. The reduction never includes out-of-bounds positions.

In the case that data_format starts with "NC", the input and output are simply transposed as follows:

  pool(input, data_format, **kwargs) =
    tf.transpose(pool(tf.transpose(input, [0] + range(2,N+2) + [1]),
                 [0, N+1] + range(1, N+1))

input Tensor of rank N+2, of shape [batch_size] + input_spatial_shape + [num_channels] if data_format does not start with "NC" (default), or [batch_size, num_channels] + input_spatial_shape if data_format starts with "NC". Pooling happens over the spatial dimensions only.
window_shape Sequence of N ints >= 1.
pooling_type Specifies pooling operation, must be "AVG" or "MAX".
strides Optional. Sequence of N ints >= 1. Defaults to [1]N. If any value of strides is > 1, then