class_docstr: Deconvolution layer for upscaling.
  
  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: ["Deconvolution","layer","for","upscaling",".","Attributes",":","features",":","Num","convolutional","features",".","padding",":","Type","of","padding",":","'SAME","'","or","'VALID","'",".","use_batch_norm",":","Whether","to","use","batchnorm","at","the","end","or","not","."]
docstr: Applies deconvolution with 3x3 kernel.
docstr_tok: ["Applies","deconvolution","with","3x3","kernel","."]
code: def __call__(self, x: jnp.ndarray, *, train: bool) -> jnp.ndarray:
      """Applies deconvolution with 3x3 kernel."""
      if self.padding == "SAME":
          padding = ((1, 2), (1, 2))
      elif self.padding == "VALID":
          padding = ((0, 0), (0, 0))
      else:
          raise ValueError(f"Unkonwn padding: {self.padding}")
      x = nn.Conv(
          features=self.features,
          kernel_size=(3, 3),
          input_dilation=(2, 2),
          padding=padding,
      )(x)
      if self.use_batch_norm:
          x = nn.BatchNorm(use_running_average=not train)(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 DeConv3x3 obj's underlying member method code with example usage: obj.__call__(x) and returns: x