      using explicit Tensorflow ops. The method is kept in the repository to support legacy
      models that have been created with this layer.
  
      In practice, it is useful to have a second convolution layer after the
      :class:`SubPixelUpscaling` layer to speed up the learning process. However, if you are stacking
      multiple :class:`SubPixelUpscaling` blocks, it may increase the number of parameters greatly,
      so the Convolution layer after :class:`SubPixelUpscaling` layer can be removed.
  
      Example
      -------
      >>> # A standard sub-pixel up-scaling block
      >>> x = Convolution2D(256, 3, 3, padding="same", activation="relu")(...)
 
</s> remove     >>> u = SubPixelUpscaling(scale_factor=2)(x)
 </s> add     >>> u = PixelShuffler(size=(2, 2))(x) </s> remove     def get_config(self):
 </s> add     def get_config(self) -> dict[str, T.Any]: </s> remove     def get_config(self):
 </s> add     def get_config(self) -> dict[str, T.Any]:
    :class:`PixelShuffler` layer to speed up the learning process. However, if you are stacking
    multiple :class:`PixelShuffler` blocks, it may increase the number of parameters greatly,
    so the Convolution layer after :class:`PixelShuffler` layer can be removed.
      using explicit Tensorflow ops. The method is kept in the repository to support legacy
      models that have been created with this layer.
  
      In practice, it is useful to have a second convolution layer after the
    :class:`PixelShuffler` layer to speed up the learning process. However, if you are stacking
    multiple :class:`PixelShuffler` blocks, it may increase the number of parameters greatly,
    so the Convolution layer after :class:`PixelShuffler` layer can be removed.
    :class:`PixelShuffler` layer to speed up the learning process. However, if you are stacking
    multiple :class:`PixelShuffler` blocks, it may increase the number of parameters greatly,
    so the Convolution layer after :class:`PixelShuffler` layer can be removed.
    :class:`PixelShuffler` layer to speed up the learning process. However, if you are stacking
    multiple :class:`PixelShuffler` blocks, it may increase the number of parameters greatly,
    so the Convolution layer after :class:`PixelShuffler` layer can be removed.
  
      Example
      -------
      >>> # A standard sub-pixel up-scaling block
      >>> x = Convolution2D(256, 3, 3, padding="same", activation="relu")(...)
keep keep keep keep replace replace replace keep keep keep keep keep
 Training fixes:
  - Fix mixed precision layer storing and switching
  - typofix in _requirements_base.txt
  - lib.model.layers - cleanup, docs and tests fixes
  - lib.model.nn_blocks - typing fixes 
lib/model/layers.py