code: def __init__(
      self,
      in_channels,
      out_channels,
      kernel_size,
      stride=1,
      groups=1,
      num_groups=32,
      bias=False,
      act=None,
  ):
      super(ConvGNBlock, self).__init__()
      self.conv = nn.Conv2D(
          in_channels,
          out_channels,
          kernel_size=kernel_size,
          stride=stride,
          padding=(kernel_size - 1) // 2,
          groups=groups,
          bias_attr=bias,
      )
      self.norm = nn.GroupNorm(
          num_groups,
          out_channels,
          weight_attr=ParamAttr(regularizer=L2Decay(0.0)),
          bias_attr=ParamAttr(regularizer=L2Decay(0.0)),
      )
      self.act = getattr(F, act) if act is not None else None
  
      self._init_weights()
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import math
  import paddle
  import paddle.nn
  import paddle.nn.functional
  from paddle import ParamAttr
  from paddle.regularizer import L2Decay
  from ppdet.core.workspace import register
  from .position_encoding import PositionEmbedding
  from ..heads.detr_head import MLP
  from .deformable_transformer import DeformableTransformerEncoderLayer, DeformableTransformerEncoder
  from .dino_transformer import DINOTransformerDecoderLayer
  from ..initializer import linear_init_, constant_, xavier_uniform_, bias_init_with_prob
  from .utils import _get_clones, get_valid_ratio, get_denoising_training_group, get_sine_pos_embed, inverse_sigmoid, mask_to_box_coordinate
label_desc: Use image node_id 1 to create a new ConvGNBlock object from inherited base classes: nn with example: obj = ConvGNBlock(in_channels, out_channels, kernel_size, stride, groups, num_groups, bias, act)