Visualize a single neuron of a single channel.

  Defaults to the center neuron. When width and height are even numbers, we
  choose the neuron in the bottom right of the center 2x2 neurons.

  Odd width & height:               Even width & height:

  +---+---+---+                     +---+---+---+---+
  |   |   |   |                     |   |   |   |   |
  +---+---+---+                     +---+---+---+---+
  |   | X |   |                     |   |   |   |   |
  +---+---+---+                     +---+---+---+---+
  |   |   |   |                     |   |   | X |   |
  +---+---+---+                     +---+---+---+---+
                                    |   |   |   |   |
                                    +---+---+---+---+

def neuron(layer_name, channel_n, x=None, y=None, batch=None):
  """Visualize a single neuron of a single channel.

  Defaults to the center neuron. When width and height are even numbers, we
  choose the neuron in the bottom right of the center 2x2 neurons.

  Odd width & height:               Even width & height:

  +---+---+---+                     +---+---+---+---+
  |   |   |   |                     |   |   |   |   |
  +---+---+---+                     +---+---+---+---+
  |   | X |   |                     |   |   |   |   |
  +---+---+---+                     +---+---+---+---+
  |   |   |   |                     |   |   | X |   |
  +---+---+---+                     +---+---+---+---+
                                    |   |   |   |   |
                                    +---+---+---+---+
  """
  def inner(T):
    layer = T(layer_name)
    shape = tf.shape(layer)
    x_ = shape[1] // 2 if x is None else x
    y_ = shape[2] // 2 if y is None else y

    if batch is None:
      return layer[:, x_, y_, channel_n]
    else:
      return layer[batch, x_, y_, channel_n]
  return inner