<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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