class_docstr: One-Class Bottleneck Embedding module.
  
  Args:
      block (Bottleneck): Expansion value is extracted from this block.
      layers (int): Numbers of OCE layers to create after multiscale feature fusion.
      groups (int, optional): Number of blocked connections from input channels to output channels.
          Defaults to 1.
      width_per_group (int, optional): Number of layers in each intermediate convolution layer. Defaults to 64.
      norm_layer (Callable[..., nn.Module] | None, optional): Batch norm layer to use. Defaults to None.
class_docstr_tok: ["One-Class","Bottleneck","Embedding","module",".","Args",":","block","(","Bottleneck",")",":","Expansion","value","is","extracted","from","this","block",".","layers","(","int",")",":","Numbers","of","OCE","layers","to","create","after","multiscale","feature","fusion",".","groups","(","int",",","optional",")",":","Number","of","blocked","connections","from","input","channels","to","output","channels",".","Defaults","to","1.","width_per_group","(","int",",","optional",")",":","Number","of","layers","in","each","intermediate","convolution","layer",".","Defaults","to","64.","norm_layer","(","Callable","[","...",",","nn.Module","]","|","None",",","optional",")",":","Batch","norm","layer","to","use",".","Defaults","to","None","."]
docstr: Forward-pass of Bottleneck layer.
  
  Args:
      features (list[Tensor]): List of features extracted from the encoder.
  
  Returns:
      Tensor: Output of the bottleneck layer
docstr_tok: ["Forward-pass","of","Bottleneck","layer",".","Args",":","features","(","list","[","Tensor","]",")",":","List","of","features","extracted","from","the","encoder",".","Returns",":","Tensor",":","Output","of","the","bottleneck","layer"]
code: def forward(self, features: list[Tensor]) -> Tensor:
      """Forward-pass of Bottleneck layer.
  
      Args:
          features (list[Tensor]): List of features extracted from the encoder.
  
      Returns:
          Tensor: Output of the bottleneck layer
      """
      # Always assumes that features has length of 3
      feature0 = self.relu(
          self.bn2(
              self.conv2(self.relu(self.bn1(self.conv1(features[0]))))
          )
      )
      feature1 = self.relu(self.bn3(self.conv3(features[1])))
      feature_cat = torch.cat([feature0, feature1, features[2]], 1)
      output = self.bn_layer(feature_cat)
      # output = self.bn_layer(self.bn4(self.conv4(feature_cat)))
  
      return output.contiguous()
  
file_path: anomalib/src/anomalib/models/reverse_distillation/components/bottleneck.py
imports: from __future__ import annotations
  from typing import Callable
  import torch
  from torch import Tensor, nn
  from torchvision.models.resnet import BasicBlock, Bottleneck
label_desc: Use image node_id 3 for calling the OCBE obj's underlying member method code with example usage: obj.forward(features) and returns: output