              model_inputs = [inp for side in model_inputs for inp in side]  # type: ignore
              model_targets = [tgt for side in model_targets for tgt in side]  # type: ignore
  
          try:
              loss: List[float] = self._model.model.train_on_batch(model_inputs, y=model_targets)
          except tf_errors.ResourceExhaustedError as err:
              msg = ("You do not have enough GPU memory available to train the selected model at "
                     "the selected settings. You can try a number of things:"
                     "\n1) Close any other application that is using your GPU (web browsers are "
                     "particularly bad for this)."
 
</s> remove         if get_backend() == "amd":  # Expand out AMD inputs + targets
            model_inputs = [inp for side in model_inputs for inp in side]  # type: ignore
            model_targets = [tgt for side in model_targets for tgt in side]  # type: ignore
 </s> add  </s> remove         except Exception as err:
            if get_backend() == "amd":
                # pylint:disable=import-outside-toplevel
                from lib.plaidml_utils import is_plaidml_error
                if (is_plaidml_error(err) and (
                        "CL_MEM_OBJECT_ALLOCATION_FAILURE" in str(err).upper() or
                        "enough memory for the current schedule" in str(err).lower())):
                    msg = ("You do not have enough GPU memory available to train the selected "
                           "model at the selected settings. You can try a number of things:"
                           "\n1) Close any other application that is using your GPU (web browsers "
                           "are particularly bad for this)."
                           "\n2) Lower the batchsize (the amount of images fed into the model "
                           "each iteration)."
                           "\n3) Use a more lightweight model, or select the model's 'LowMem' "
                           "option (in config) if it has one.")
                    raise FaceswapError(msg) from err
            raise
 </s> add  </s> remove         except Exception as err:
            if get_backend() == "amd":
                # pylint:disable=import-outside-toplevel
                from lib.plaidml_utils import is_plaidml_error
                if (is_plaidml_error(err) and (
                        "CL_MEM_OBJECT_ALLOCATION_FAILURE" in str(err).upper() or
                        "enough memory for the current schedule" in str(err).lower())):
                    msg = ("You do not have enough GPU memory available to run detection at "
                           "the selected batch size. You can try a number of things:"
                           "\n1) Close any other application that is using your GPU (web "
                           "browsers are particularly bad for this)."
                           "\n2) Lower the batchsize (the amount of images fed into the "
                           "model) by editing the plugin settings (GUI: Settings > Configure "
                           "extract settings, CLI: Edit the file "
                           "faceswap/config/extract.ini).")
                    raise FaceswapError(msg) from err
            raise
 </s> add  </s> remove         model_inputs: List[List[np.ndarray]] = []
        model_targets: List[List[np.ndarray]] = []
 </s> add         model_inputs: T.List[T.List[np.ndarray]] = []
        model_targets: T.List[T.List[np.ndarray]] = [] </s> remove     freeze_layers=dict(
        default="keras_encoder",
        info="If the command line option 'freeze-weights' is enabled, then the layers indicated "
             "here will be frozen the next time the model starts up. NB: Not all architectures "
             "contain all of the layers listed here, so any layers marked for freezing that are "
             "not within your chosen architecture will be ignored. EG:\n If 'split fc' has "
             "been selected, then 'fc_a' and 'fc_b' are available for freezing. If it has "
             "not been selected then 'fc_both' is available for freezing.",
        datatype=list,
        choices=["encoder", "keras_encoder", "fc_a", "fc_b", "fc_both", "fc_shared", "fc_gblock",
                 "g_block_a", "g_block_b", "g_block_both", "decoder_a", "decoder_b",
                 "decoder_both"],
        group="weights",
        fixed=False),
    load_layers=dict(
        default="encoder",
        info="If the command line option 'load-weights' is populated, then the layers indicated "
             "here will be loaded from the given weights file if starting a new model. NB Not all "
             "architectures contain all of the layers listed here, so any layers marked for "
             "loading that are not within your chosen architecture will be ignored. EG:\n If "
             "'split fc' has been selected, then 'fc_a' and 'fc_b' are available for loading. If "
             "it has not been selected then 'fc_both' is available for loading.",
        datatype=list,
        choices=["encoder", "fc_a", "fc_b", "fc_both", "fc_shared", "fc_gblock", "g_block_a",
                 "g_block_b", "g_block_both", "decoder_a", "decoder_b", "decoder_both"],
        group="weights",
        fixed=True),
 </s> add     "freeze_layers": {
        "default": "keras_encoder",
        "info": (
            "If the command line option 'freeze-weights' is enabled, then the layers indicated "
            "here will be frozen the next time the model starts up. NB: Not all architectures "
            "contain all of the layers listed here, so any layers marked for freezing that are "
            "not within your chosen architecture will be ignored. EG:\n If 'split fc' has "
            "been selected, then 'fc_a' and 'fc_b' are available for freezing. If it has "
            "not been selected then 'fc_both' is available for freezing."),
        "datatype": list,
        "choices": ["encoder", "keras_encoder", "fc_a", "fc_b", "fc_both", "fc_shared",
                    "fc_gblock", "g_block_a", "g_block_b", "g_block_both", "decoder_a",
                    "decoder_b", "decoder_both"],
        "group": "weights",
        "fixed": False},
    "load_layers": {
        "default": "encoder",
        "info": (
            "If the command line option 'load-weights' is populated, then the layers indicated "
            "here will be loaded from the given weights file if starting a new model. NB Not all "
            "architectures contain all of the layers listed here, so any layers marked for "
            "loading that are not within your chosen architecture will be ignored. EG:\n If "
            "'split fc' has been selected, then 'fc_a' and 'fc_b' are available for loading. If "
            "it has not been selected then 'fc_both' is available for loading."),
        "datatype": list,
        "choices": ["encoder", "fc_a", "fc_b", "fc_both", "fc_shared", "fc_gblock", "g_block_a",
                    "g_block_b", "g_block_both", "decoder_a", "decoder_b", "decoder_both"],
        "group": "weights",
        "fixed": True},
            loss: T.List[float] = self._model.model.train_on_batch(model_inputs, y=model_targets)
              model_inputs = [inp for side in model_inputs for inp in side]  # type: ignore
              model_targets = [tgt for side in model_targets for tgt in side]  # type: ignore
  
          try:
            loss: T.List[float] = self._model.model.train_on_batch(model_inputs, y=model_targets)
          except tf_errors.ResourceExhaustedError as err:
              msg = ("You do not have enough GPU memory available to train the selected model at "
                     "the selected settings. You can try a number of things:"
                     "\n1) Close any other application that is using your GPU (web browsers are "
                     "particularly bad for this)."
keep keep keep keep replace keep keep keep keep keep
 Remove plaidML support (#1325)

* Remove PlaidML reference from readme files

* Remove AMD option from installers

* remove amd requirements and update setup.py

* remove plaidml test from CI workflow

* gpustats: remove plaidml backend

* plaid removals:
  - faceswap.py - python version check
  - setup.cfg - plaidml typing ignore
  - lib.keras_utils - All plaid code
  - lib.launcher.py - All plaidml checks and configuration

* remove tf2.2 specific code from GUI event reader

* lib.model - remove all plaidml implementations

* plugins.extract - remove plaidml code

* plugins.train remove plaidml code

* lib.convert - remove plaidml code

* tools.model: remove plaidml code

* Remove plaidML tests from unit tests

* remove plaidml_utils and docsting cleanups

* Remove plaidML refs from configs

* fix keras imports 
plugins/train/trainer/_base.py