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 _channel_shuffle(self, x):
      bs, num_channels, height, width = x.size()
      # NOTE: this line is commented for torchscript
      # assert (num_channels % 4 == 0)
      x = x.reshape(bs * num_channels // 2, 2, height * width)
      x = x.permute(1, 0, 2)
      x = x.reshape(2, -1, num_channels // 2, height, width)
      return x[0], 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 4 for calling the ShuffleNetBlock obj's underlying member method code with example usage: obj._channel_shuffle(x) and returns: x,  x