docs: def _build(self, inputs, **normalization_build_kwargs):
      """Assembles the `ConvNet2D` and connects it to the graph.
  
      Args:
        inputs: A 4D Tensor of shape `[batch_size, input_height, input_width,
          input_channels]`.
        **normalization_build_kwargs: kwargs passed to the normalization module
          at _build time.
  
      Returns:
        A 4D Tensor of shape `[batch_size, output_height, output_width,
          output_channels[-1]]`.
  
      Raises:
        ValueError: If `is_training` is not explicitly specified when using
          batch normalization.
      """
      if (self._normalization_ctor in {batch_norm.BatchNorm,
                                       batch_norm_v2.BatchNormV2} and
          "is_training" not in normalization_build_kwargs):
        raise ValueError("Boolean is_training flag must be explicitly specified "
                         "when using batch normalization.")
  
      self._input_shape = tuple(inputs.get_shape().as_list())
      net = inputs
  
      final_index = len(self._layers) - 1
      for i, layer in enumerate(self._layers):
        net = layer(net)
  
        if i != final_index or self._normalize_final:
          if self._normalization_ctor is not None:
            # The name 'batch_norm' is used even if something else like
            # LayerNorm is being used. This is to avoid breaking old checkpoints.
            normalizer = self._normalization_ctor(
                name="batch_norm_{}".format(i),
                **self._normalization_kwargs)
  
            net = normalizer(
                net, **util.remove_unsupported_kwargs(
                    normalizer, normalization_build_kwargs))
          else:
            if normalization_build_kwargs:
              tf.logging.warning(
                  "No normalization configured, but extra kwargs "
                  "provided: {}".format(normalization_build_kwargs))
  
        if i != final_index or self._activate_final:
          net = self._activation(net)
  
      return net