class_docstr: Method from Chen et al., 2018 performing poisoning detection based on activations clustering.
  
  | Paper link: https://arxiv.org/abs/1811.03728
  
  | Please keep in mind the limitations of defences. For more information on the limitations of this
      defence, see https://arxiv.org/abs/1905.13409 . For details on how to evaluate classifier security
      in general, see https://arxiv.org/abs/1902.06705
docstr: Revert poison attack by continue training the current classifier with `x`, `y_fix`. `n_splits` determines the
  number of cross validation splits.
  
  :param classifier: Classifier to be fixed.
  :param x: Samples that were miss-labeled.
  :param y_fix: True label of `x`.
  :param n_splits: Determines how many splits to use in cross validation (only used if `cross_validation=True`).
  :param tolerable_backdoor: Threshold that determines what is the maximum tolerable backdoor success rate.
  :param max_epochs: Maximum number of epochs that the model will be trained.
  :param batch_epochs: Number of epochs to be trained before checking current state of model.
  :return: (improve_factor, classifier)
docstr_tok: ["Revert","poison","attack","by","continue","training","the","current","classifier","with","`","x","`",",","`","y_fix","`",".","`","n_splits","`","determines","the","number","of","cross","validation","splits",".",":","param","classifier",":","Classifier","to","be","fixed",".",":","param","x",":","Samples","that","were","miss-labeled",".",":","param","y_fix",":","True","label","of","`","x","`",".",":","param","n_splits",":","Determines","how","many","splits","to","use","in","cross","validation","(","only","used","if","`","cross_validation=True","`",")",".",":","param","tolerable_backdoor",":","Threshold","that","determines","what","is","the","maximum","tolerable","backdoor","success","rate",".",":","param","max_epochs",":","Maximum","number","of","epochs","that","the","model","will","be","trained",".",":","param","batch_epochs",":","Number","of","epochs","to","be","trained","before","checking","current","state","of","model",".",":","return",":","(","improve_factor",",","classifier",")"]
code: def relabel_poison_cross_validation(
      classifier: "CLASSIFIER_NEURALNETWORK_TYPE",
      x: np.ndarray,
      y_fix: np.ndarray,
      n_splits: int = 10,
      tolerable_backdoor: float = 0.01,
      max_epochs: int = 50,
      batch_epochs: int = 10,
  ) -> Tuple[float, "CLASSIFIER_NEURALNETWORK_TYPE"]:
      """
      Revert poison attack by continue training the current classifier with `x`, `y_fix`. `n_splits` determines the
      number of cross validation splits.
  
      :param classifier: Classifier to be fixed.
      :param x: Samples that were miss-labeled.
      :param y_fix: True label of `x`.
      :param n_splits: Determines how many splits to use in cross validation (only used if `cross_validation=True`).
      :param tolerable_backdoor: Threshold that determines what is the maximum tolerable backdoor success rate.
      :param max_epochs: Maximum number of epochs that the model will be trained.
      :param batch_epochs: Number of epochs to be trained before checking current state of model.
      :return: (improve_factor, classifier)
      """
      # pylint: disable=E0001
      from sklearn.model_selection import KFold
  
      # Train using cross validation
      k_fold = KFold(n_splits=n_splits)
      KFold(n_splits=n_splits, random_state=None, shuffle=True)
  
      filename = "original_classifier" + str(time.time()) + ".p"
      ActivationDefence._pickle_classifier(classifier, filename)
      curr_improvement = 0
  
      for train_index, test_index in k_fold.split(x):
          # Obtain partition:
          x_train, x_test = x[train_index], x[test_index]
          y_train, y_test = y_fix[train_index], y_fix[test_index]
          # Unpickle original model:
          curr_classifier = ActivationDefence._unpickle_classifier(
              filename
          )
  
          new_improvement, fixed_classifier = train_remove_backdoor(
              curr_classifier,
              x_train,
              y_train,
              x_test,
              y_test,
              tolerable_backdoor=tolerable_backdoor,
              max_epochs=max_epochs,
              batch_epochs=batch_epochs,
          )
          if curr_improvement < new_improvement and new_improvement > 0:
              curr_improvement = new_improvement
              classifier = fixed_classifier
              logger.info(
                  "Selected as best model so far: %s", curr_improvement
              )
  
      ActivationDefence._remove_pickle(filename)
      return curr_improvement, classifier
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  import os
  import pickle
  import time
  from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
  import numpy
  from sklearn.cluster import KMeans, MiniBatchKMeans
  from art import config
  from art.data_generators import DataGenerator
  from art.defences.detector.poison.clustering_analyzer import ClusteringAnalyzer
  from art.defences.detector.poison.ground_truth_evaluator import GroundTruthEvaluator
  from art.defences.detector.poison.poison_filtering_defence import PoisonFilteringDefence
  from art.utils import segment_by_class
  from art.visualization import create_sprite, save_image, plot_3d
label_desc: Use image node_id 8 for calling the ActivationDefence obj's underlying member method code with example usage: obj.relabel_poison_cross_validation(classifier, x, y_fix, n_splits, tolerable_backdoor, max_epochs, batch_epochs) and returns: curr_improvement,  classifier