class_docstr: Updates FeCAM cov and prototypes
  using the data contained inside a memory buffer
class_docstr_tok: ["Updates","FeCAM","cov","and","prototypes","using","the","data","contained","inside","a","memory","buffer"]
code: def after_training_exp(self, strategy, **kwargs):
      _check_has_fecam(strategy.model)
  
      self.storage_policy.update(strategy)
  
      class_means, class_cov = _gather_means_and_cov(
          strategy.model,
          self.storage_policy.buffer.eval(),
          strategy.train_mb_size,
          strategy.device,
          **kwargs,
      )
  
      strategy.model.eval_classifier.update_class_means_dict(
          class_means
      )
      strategy.model.eval_classifier.update_class_cov_dict(class_cov)
  
imports: import copy
  from typing import Dict
  import numpy
  import torch
  import torch.nn.functional
  from torch import Tensor, nn
  from avalanche.benchmarks.utils import concat_datasets
  from avalanche.models import FeCAMClassifier
  from avalanche.models.fecam import compute_covariance, compute_means
  from avalanche.training.plugins import SupervisedPlugin
  from avalanche.training.storage_policy import ClassBalancedBuffer
  from avalanche.training.templates import SupervisedTemplate
label_desc: Use image node_id 2 for calling the MemoryFeCAMUpdate obj's underlying member method code with example usage: obj.after_training_exp(strategy) without return types