code: def __init__(
      self,
      in_channels,
      block_size,
      groups,
      act_layer=nn.ReLU,
      norm_layer=nn.BatchNorm2d,
  ):
      super(BilinearAttnTransform, self).__init__()
  
      self.conv1 = ConvNormAct(
          in_channels,
          groups,
          1,
          act_layer=act_layer,
          norm_layer=norm_layer,
      )
      self.conv_p = nn.Conv2d(
          groups,
          block_size * block_size * groups,
          kernel_size=(block_size, 1),
      )
      self.conv_q = nn.Conv2d(
          groups,
          block_size * block_size * groups,
          kernel_size=(1, block_size),
      )
      self.conv2 = ConvNormAct(
          in_channels,
          in_channels,
          1,
          act_layer=act_layer,
          norm_layer=norm_layer,
      )
      self.block_size = block_size
      self.groups = groups
      self.in_channels = in_channels
  
file_path: pytorch-image-models/timm/layers/non_local_attn.py
imports: import torch
  from torch import nn
  from torch.nn import functional
  from .conv_bn_act import ConvNormAct
  from .helpers import make_divisible
  from .trace_utils import _assert
label_desc: Use image node_id 1 to create a new BilinearAttnTransform object from inherited base classes: nn with example: obj = BilinearAttnTransform(in_channels, block_size, groups, act_layer, norm_layer)