class_docstr: This corresponds to the `Block` class in the original implementation.
  
  There are two equivalent implementations: [DwConv, LayerNorm (channels_first), Conv, GELU,1x1 Conv]; all in (N, C,
  H, W) (2) [DwConv, Permute to (N, H, W, C), LayerNorm (channels_last), Linear, GELU, Linear]; Permute back
  
  The authors used (2) as they find it slightly faster in PyTorch. Since we already permuted the inputs to follow
  NHWC ordering, we can just apply the operations straight-away without the permutation.
  
  Args:
      config ([`ConvNextConfig`]): Model configuration class.
      dim (`int`): Number of input channels.
      drop_path (`float`): Stochastic depth rate. Default: 0.0.
code: def build(self, input_shape: tf.TensorShape = None):
      # PT's `nn.Parameters` must be mapped to a TF layer weight to inherit the same name hierarchy (and vice-versa)
      self.layer_scale_parameter = (
          self.add_weight(
              shape=(self.dim,),
              initializer=tf.keras.initializers.Constant(
                  value=self.config.layer_scale_init_value
              ),
              trainable=True,
              name="layer_scale_parameter",
          )
          if self.config.layer_scale_init_value > 0
          else None
      )
  
      if self.built:
          return
      self.built = True
      if getattr(self, "dwconv", None) is not None:
          with tf.name_scope(self.dwconv.name):
              self.dwconv.build([None, None, None, self.dim])
      if getattr(self, "layernorm", None) is not None:
          with tf.name_scope(self.layernorm.name):
              self.layernorm.build([None, None, None, self.dim])
      if getattr(self, "pwconv1", None) is not None:
          with tf.name_scope(self.pwconv1.name):
              self.pwconv1.build([None, None, self.dim])
      if getattr(self, "pwconv2", None) is not None:
          with tf.name_scope(self.pwconv2.name):
              self.pwconv2.build([None, None, 4 * self.dim])
      if getattr(self, "drop_path", None) is not None:
          with tf.name_scope(self.drop_path.name):
              self.drop_path.build(None)
  
imports: from __future__ import annotations
  from typing import List, Optional, Tuple, Union
  import numpy
  import tensorflow
  from ...activations_tf import get_tf_activation
  from ...modeling_tf_outputs import TFBaseModelOutput, TFBaseModelOutputWithPooling, TFSequenceClassifierOutput
  from ...modeling_tf_utils import TFModelInputType, TFPreTrainedModel, TFSequenceClassificationLoss, get_initializer, keras_serializable, unpack_inputs
  from ...tf_utils import shape_list
  from ...utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings
  from .configuration_convnext import ConvNextConfig
label_desc: Use image node_id 2 for calling the TFConvNextLayer obj's underlying member method code with example usage: obj.build(input_shape) without return types