class_docstr: Extract features from a CNN.
  
  Args:
      backbone (nn.Module): The backbone to which the feature extraction hooks are attached.
      layers (Iterable[str]): List of layer names of the backbone to which the hooks are attached.
      pre_trained (bool): Whether to use a pre-trained backbone. Defaults to True.
      requires_grad (bool): Whether to require gradients for the backbone. Defaults to False.
          Models like ``stfpm`` use the feature extractor model as a trainable network. In such cases gradient
          computation is required.
  
  Example:
      >>> import torch
      >>> from anomalib.models.components.feature_extractors import TimmFeatureExtractor
  
      >>> model = TimmFeatureExtractor(model="resnet18", layers=['layer1', 'layer2', 'layer3'])
      >>> input = torch.rand((32, 3, 256, 256))
      >>> features = model(input)
  
      >>> [layer for layer in features.keys()]
          ['layer1', 'layer2', 'layer3']
      >>> [feature.shape for feature in features.values()]
          [torch.Size([32, 64, 64, 64]), torch.Size([32, 128, 32, 32]), torch.Size([32, 256, 16, 16])]
code: def __init__(
      self,
      backbone: str,
      layers: list[str],
      pre_trained: bool = True,
      requires_grad: bool = False,
  ):
      super().__init__()
  
      # Extract backbone-name and weight-URI from the backbone string.
      if "__AT__" in backbone:
          backbone, uri = backbone.split("__AT__")
          pretrained_cfg = timm.models.registry.get_pretrained_cfg(
              backbone
          )
          # Override pretrained_cfg["url"] to use different pretrained weights.
          pretrained_cfg["url"] = uri
      else:
          pretrained_cfg = None
  
      self.backbone = backbone
      self.layers = layers
      self.idx = self._map_layer_to_idx()
      self.requires_grad = requires_grad
      self.feature_extractor = timm.create_model(
          backbone,
          pretrained=pre_trained,
          pretrained_cfg=pretrained_cfg,
          features_only=True,
          exportable=True,
          out_indices=self.idx,
      )
      self.out_dims = self.feature_extractor.feature_info.channels()
      self._features = {layer: torch.empty(0) for layer in self.layers}
  
file_path: anomalib/src/anomalib/models/components/feature_extractors/timm.py
imports: from __future__ import annotations
  import logging
  import warnings
  import timm
  import torch
  from torch import Tensor, nn
label_desc: Use image node_id 1 to create a new TimmFeatureExtractor object from inherited base classes: nn with example: obj = TimmFeatureExtractor(backbone, layers, pre_trained, requires_grad)