class_docstr: Cross convolution for the three scales.
  
  Args:
      in_channels (int): Number of input channels.
      channels (int): Number of output channels in the hidden convolution and the upscaling layers.
      channels_hidden (int, optional): Number of input channels in the hidden convolution layers. Defaults to 512.
      kernel_size (int, optional): Kernel size of the convolution layers. Defaults to 3.
      leaky_slope (float, optional): Slope of the leaky ReLU activation. Defaults to 0.1.
      batch_norm (bool, optional): Whether to use batch normalization. Defaults to False.
      use_gamma (bool, optional): Whether to use gamma parameters for the cross convolutions. Defaults to True.
docstr: Applies the cross convolution to the three scales.
  
  This block is represented in figure 4 of the paper.
  
  Returns:
      tuple[Tensor, Tensor, Tensor]: Tensors indicating scale and transform parameters as a single tensor for
      each scale. The scale parameters are the first part across channel dimension and the transform parameters
      are the second.
docstr_tok: ["Applies","the","cross","convolution","to","the","three","scales",".","This","block","is","represented","in","figure","4","of","the","paper",".","Returns",":","tuple","[","Tensor",",","Tensor",",","Tensor","]",":","Tensors","indicating","scale","and","transform","parameters","as","a","single","tensor","for","each","scale",".","The","scale","parameters","are","the","first","part","across","channel","dimension","and","the","transform","parameters","are","the","second","."]
code: def forward(
      self, scale0, scale1, scale2
  ) -> tuple[Tensor, Tensor, Tensor]:
      """Applies the cross convolution to the three scales.
  
      This block is represented in figure 4 of the paper.
  
      Returns:
          tuple[Tensor, Tensor, Tensor]: Tensors indicating scale and transform parameters as a single tensor for
          each scale. The scale parameters are the first part across channel dimension and the transform parameters
          are the second.
      """
      # Increase the number of channels to hidden channel length via convolutions and apply leaky ReLU.
      out0 = self.conv_scale0_0(scale0)
      out1 = self.conv_scale1_0(scale1)
      out2 = self.conv_scale2_0(scale2)
  
      lr0 = self.leaky_relu(out0)
      lr1 = self.leaky_relu(out1)
      lr3 = self.leaky_relu(out2)
  
      # Decrease the number of channels to scale and transform split length.
      out0 = self.conv_scale0_1(lr0)
      out1 = self.conv_scale1_1(lr1)
      out2 = self.conv_scale2_1(lr3)
  
      # Upsample the smaller scales.
      y1_up = self.up_conv10(self.upsample(lr1))
      y2_up = self.up_conv21(self.upsample(lr3))
  
      # Downsample the larger scales.
      y0_down = self.down_conv01(lr0)
      y1_down = self.down_conv12(lr1)
  
      # Do element-wise sum on cross-scale outputs.
      out0 = out0 + y1_up
      out1 = out1 + y0_down + y2_up
      out2 = out2 + y1_down
  
      if self.use_gamma:
          out0 = out0 * self.gamma0
          out1 = out1 * self.gamma1
          out2 = out2 * self.gamma2
      # even channel split is performed outside this block
      return out0, out1, out2
  
imports: from __future__ import annotations
  from math import exp
  import numpy
  import torch
  import torch.nn.functional
  from FrEIA.framework import GraphINN, InputNode, Node, OutputNode
  from FrEIA.modules import InvertibleModule
  from torch import Tensor, nn
  from torchvision.models.efficientnet import EfficientNet_B5_Weights
  from anomalib.models.components.feature_extractors import TorchFXFeatureExtractor
  from .anomaly_map import AnomalyMapGenerator, AnomalyMapMode
label_desc: Use image node_id 2 for calling the CrossConvolutions obj's underlying member method code with example usage: obj.forward(scale0, scale1, scale2) and returns: out0,  out1,  out2