def max_pool_forward_reshape(x, pool_param):
    '\n  A fast implementation of the forward pass for the max pooling layer that uses\n  some clever reshaping.\n\n  This can only be used for square pooling regions that tile the input.\n  '
    (N, C, H, W) = x.shape
    (pool_height, pool_width) = (pool_param['pool_height'], pool_param['pool_width'])
    stride = pool_param['stride']
    assert (pool_height == pool_width == stride), 'Invalid pool params'
    assert ((H % pool_height) == 0)
    assert ((W % pool_height) == 0)
    x_reshaped = x.reshape(N, C, (H / pool_height), pool_height, (W / pool_width), pool_width)
    out = x_reshaped.max(axis=3).max(axis=4)
    cache = (x, x_reshaped, out)
    return (out, cache)
A fast implementation of the forward pass for the max pooling layer that uses
some clever reshaping.

This can only be used for square pooling regions that tile the input.
def max_pool_forward_reshape(x, pool_param):
    '\n  A fast implementation of the forward pass for the max pooling layer that uses\n  some clever reshaping.\n\n  This can only be used for square pooling regions that tile the input.\n  '
    (N, C, H, W) = x.shape
    (pool_height, pool_width) = (pool_param['pool_height'], pool_param['pool_width'])
    stride = pool_param['stride']
    assert (pool_height == pool_width == stride), 'Invalid pool params'
    assert ((H % pool_height) == 0)
    assert ((W % pool_height) == 0)
    x_reshaped = x.reshape(N, C, (H / pool_height), pool_height, (W / pool_width), pool_width)
    out = x_reshaped.max(axis=3).max(axis=4)
    cache = (x, x_reshaped, out)
    return (out, cache)