class_docstr: Describe the basic building block of shuffle net, as described in
  `ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices <https://arxiv.org/pdf/1707.01083.pdf>`__.
  
  When stride = 1, the block expects an input with ``2 * input channels``. Otherwise input channels.
code: def forward(self, x):
      if self.stride == 2:
          x_proj, x = self.branch_proj(x), x
      else:
          x_proj, x = self._channel_shuffle(x)
      return torch.cat((x_proj, self.branch_main(x)), 1)
  
imports: from typing import Union, cast
  import torch
  import torch.nn
  import nni
  from nni.mutable import MutableExpression
  from nni.nas.nn.pytorch import LayerChoice, ModelSpace, MutableConv2d, MutableBatchNorm2d
  from .utils.pretrained import load_pretrained_weight
label_desc: Use image node_id 2 for calling the ShuffleNetBlock obj's underlying member method code with example usage: obj.forward(x) and returns: torch