class_docstr: MV2 block described in MobileNetV2.
  Paper: https://arxiv.org/pdf/1801.04381
  Based on: https://github.com/tonylins/pytorch-mobilenet-v2
code: def __init__(self, inp, oup, stride=1, expansion=4):
      super().__init__()
      self.stride = stride
      assert stride in [1, 2]
  
      hidden_dim = int(inp * expansion)
      self.use_res_connect = self.stride == 1 and inp == oup
  
      if expansion == 1:
          self.conv = nn.Sequential(
              # dw
              nn.Conv2d(
                  hidden_dim,
                  hidden_dim,
                  3,
                  stride,
                  1,
                  groups=hidden_dim,
                  bias=False,
              ),
              nn.BatchNorm2d(hidden_dim),
              nn.SiLU(),
              # pw-linear
              nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),
              nn.BatchNorm2d(oup),
          )
      else:
          self.conv = nn.Sequential(
              # pw
              nn.Conv2d(inp, hidden_dim, 1, 1, 0, bias=False),
              nn.BatchNorm2d(hidden_dim),
              nn.SiLU(),
              # dw
              nn.Conv2d(
                  hidden_dim,
                  hidden_dim,
                  3,
                  stride,
                  1,
                  groups=hidden_dim,
                  bias=False,
              ),
              nn.BatchNorm2d(hidden_dim),
              nn.SiLU(),
              # pw-linear
              nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),
              nn.BatchNorm2d(oup),
          )
  
imports: import torch
  import torch.nn
  from einops import rearrange
  from einops.layers.torch import Reduce
label_desc: Use image node_id 1 to create a new MV2Block object from inherited base classes: nn with example: obj = MV2Block(inp, oup, stride, expansion)