class_docstr: A quasi-UNet block, using `PixelShuffle_ICNR upsampling`.
code: def __init__(
      self,
      up_in_c,
      x_in_c,
      hook,
      final_div=True,
      blur=False,
      act_cls=defaults.activation,
      self_attention=False,
      init=nn.init.kaiming_normal_,
      norm_type=None,
      **kwargs,
  ):
      self.hook = hook
      self.shuf = PixelShuffle_ICNR(
          up_in_c,
          up_in_c // 2,
          blur=blur,
          act_cls=act_cls,
          norm_type=norm_type,
      )
      self.bn = BatchNorm(x_in_c)
      ni = up_in_c // 2 + x_in_c
      nf = ni if final_div else ni // 2
      self.conv1 = ConvLayer(
          ni, nf, act_cls=act_cls, norm_type=norm_type, **kwargs
      )
      self.conv2 = ConvLayer(
          nf,
          nf,
          act_cls=act_cls,
          norm_type=norm_type,
          xtra=SelfAttention(nf) if self_attention else None,
          **kwargs,
      )
      self.relu = act_cls()
      apply_init(nn.Sequential(self.conv1, self.conv2), init)
  
file_path: fastai/fastai/vision/models/unet.py
imports: from __future__ import annotations
  from ...torch_basics import *
  from ...callback.hook import *
label_desc: Use image node_id 1 to create a new UnetBlock object from inherited base classes: Module with example: obj = UnetBlock(up_in_c, x_in_c, hook, final_div, blur, act_cls, _attention, init, norm_type)