class_docstr: Two unpadded convolutions & relus.
  
  Attributes:
    features: Num convolutional features.
    padding: Type of padding: 'SAME' or 'VALID'.
    use_batch_norm: Whether to use batchnorm at the end or not.
class_docstr_tok: ["Two","unpadded","convolutions","&","relus",".","Attributes",":","features",":","Num","convolutional","features",".","padding",":","Type","of","padding",":","'SAME","'","or","'VALID","'",".","use_batch_norm",":","Whether","to","use","batchnorm","at","the","end","or","not","."]
code: def __call__(self, x: jnp.ndarray, *, train: bool) -> jnp.ndarray:
      x = Conv3x3(
          features=self.features, name="conv1", padding=self.padding
      )(x)
      if self.use_batch_norm:
          x = nn.BatchNorm(use_running_average=not train)(x)
      x = nn.relu(x)
      x = Conv3x3(
          features=self.features, name="conv2", padding=self.padding
      )(x)
      if self.use_batch_norm:
          x = nn.BatchNorm(use_running_average=not train)(x)
      x = nn.relu(x)
      return x
  
imports: import functools
  from typing import Tuple
  import flax.linen
  import jax.numpy
  import ml_collections
  from scenic.model_lib.base_models.segmentation_model import SegmentationModel
  from scenic.model_lib.layers import nn_layers
  from scenic.model_lib.layers import nn_ops
label_desc: Use image node_id 1 for calling the ConvRelu2 obj's underlying member method code with example usage: obj.__call__(x) and returns: x