class_docstr: A Resnet block.
  
  Parameters:
      in_channels (`int`): The number of channels in the input.
      out_channels (`int`, *optional*, default to be `None`):
          The number of output channels for the first conv2d layer. If None, same as `in_channels`.
      dropout (`float`, *optional*, defaults to `0.0`): The dropout probability to use.
      temb_channels (`int`, *optional*, default to `512`): the number of channels in timestep embedding.
      groups (`int`, *optional*, default to `32`): The number of groups to use for the first normalization layer.
      groups_out (`int`, *optional*, default to None):
          The number of groups to use for the second normalization layer. if set to None, same as `groups`.
      eps (`float`, *optional*, defaults to `1e-6`): The epsilon to use for the normalization.
      non_linearity (`str`, *optional*, default to `"swish"`): the activation function to use.
      time_embedding_norm (`str`, *optional*, default to `"default"` ): Time scale shift config.
          By default, apply timestep embedding conditioning with a simple shift mechanism. Choose "scale_shift" or
          "ada_group" for a stronger conditioning with scale and shift.
      kernel (`torch.FloatTensor`, optional, default to None): FIR filter, see
          [`~models.resnet.FirUpsample2D`] and [`~models.resnet.FirDownsample2D`].
      output_scale_factor (`float`, *optional*, default to be `1.0`): the scale factor to use for the output.
      use_in_shortcut (`bool`, *optional*, default to `True`):
          If `True`, add a 1x1 nn.conv2d layer for skip-connection.
      up (`bool`, *optional*, default to `False`): If `True`, add an upsample layer.
      down (`bool`, *optional*, default to `False`): If `True`, add a downsample layer.
      conv_shortcut_bias (`bool`, *optional*, default to `True`):  If `True`, adds a learnable bias to the
          `conv_shortcut` output.
      conv_2d_out_channels (`int`, *optional*, default to `None`): the number of channels in the output.
          If None, same as `out_channels`.
class_docstr_tok: ["A","Resnet","block",".","Parameters",":","in_channels","(","`","int","`",")",":","The","number","of","channels","in","the","input",".","out_channels","(","`","int","`",",","*","optional","*",",","default","to","be","`","None","`",")",":","The","number","of","output","channels","for","the","first","conv2d","layer",".","If","None",",","same","as","`","in_channels","`",".","dropout","(","`","float","`",",","*","optional","*",",","defaults","to","`","0.0","`",")",":","The","dropout","probability","to","use",".","temb_channels","(","`","int","`",",","*","optional","*",",","default","to","`","512","`",")",":","the","number","of","channels","in","timestep","embedding",".","groups","(","`","int","`",",","*","optional","*",",","default","to","`","32","`",")",":","The","number","of","groups","to","use","for","the","first","normalization","layer",".","groups_out","(","`","int","`",",","*","optional","*",",","default","to","None",")",":","The","number","of","groups","to","use","for","the","second","normalization","layer",".","if","set","to","None",",","same","as","`","groups","`",".","eps","(","`","float","`",",","*","optional","*",",","defaults","to","`","1e-6","`",")",":","The","epsilon","to","use","for","the","normalization",".","non_linearity","(","`","str","`",",","*","optional","*",",","default","to","`","``","swish","''","`",")",":","the","activation","function","to","use",".","time_embedding_norm","(","`","str","`",",","*","optional","*",",","default","to","`","``","default","''","`",")",":","Time","scale","shift","config",".","By","default",",","apply","timestep","embedding","conditioning","with","a","simple","shift","mechanism",".","Choose","``","scale_shift","''","or","``","ada_group","''","for","a","stronger","conditioning","with","scale","and","shift",".","kernel","(","`","torch.FloatTensor","`",",","optional",",","default","to","None",")",":","FIR","filter",",","see","[","`","~models.resnet.FirUpsample2D","`","]","and","[","`","~models.resnet.FirDownsample2D","`","]",".","output_scale_factor","(","`","float","`",",","*","optional","*",",","default","to","be","`","1.0","`",")",":","the","scale","factor","to","use","for","the","output",".","use_in_shortcut","(","`","bool","`",",","*","optional","*",",","default","to","`","True","`",")",":","If","`","True","`",",","add","a","1x1","nn.conv2d","layer","for","skip-connection",".","up","(","`","bool","`",",","*","optional","*",",","default","to","`","False","`",")",":","If","`","True","`",",","add","an","upsample","layer",".","down","(","`","bool","`",",","*","optional","*",",","default","to","`","False","`",")",":","If","`","True","`",",","add","a","downsample","layer",".","conv_shortcut_bias","(","`","bool","`",",","*","optional","*",",","default","to","`","True","`",")",":","If","`","True","`",",","adds","a","learnable","bias","to","the","`","conv_shortcut","`","output",".","conv_2d_out_channels","(","`","int","`",",","*","optional","*",",","default","to","`","None","`",")",":","the","number","of","channels","in","the","output",".","If","None",",","same","as","`","out_channels","`","."]
code: def __init__(
      self,
      *,
      in_channels: int,
      out_channels: Optional[int] = None,
      conv_shortcut: bool = False,
      dropout: float = 0.0,
      temb_channels: int = 512,
      groups: int = 32,
      groups_out: Optional[int] = None,
      pre_norm: bool = True,
      eps: float = 1e-6,
      non_linearity: str = "swish",
      skip_time_act: bool = False,
      time_embedding_norm: str = "default",  # default, scale_shift, ada_group, spatial
      kernel: Optional[torch.FloatTensor] = None,
      output_scale_factor: float = 1.0,
      use_in_shortcut: Optional[bool] = None,
      up: bool = False,
      down: bool = False,
      conv_shortcut_bias: bool = True,
      conv_2d_out_channels: Optional[int] = None,
  ):
      super().__init__()
      self.pre_norm = pre_norm
      self.pre_norm = True
      self.in_channels = in_channels
      out_channels = (
          in_channels if out_channels is None else out_channels
      )
      self.out_channels = out_channels
      self.use_conv_shortcut = conv_shortcut
      self.up = up
      self.down = down
      self.output_scale_factor = output_scale_factor
      self.time_embedding_norm = time_embedding_norm
      self.skip_time_act = skip_time_act
  
      linear_cls = (
          nn.Linear if USE_PEFT_BACKEND else LoRACompatibleLinear
      )
      conv_cls = nn.Conv2d if USE_PEFT_BACKEND else LoRACompatibleConv
  
      if groups_out is None:
          groups_out = groups
  
      if self.time_embedding_norm == "ada_group":
          self.norm1 = AdaGroupNorm(
              temb_channels, in_channels, groups, eps=eps
          )
      elif self.time_embedding_norm == "spatial":
          self.norm1 = SpatialNorm(in_channels, temb_channels)
      else:
          self.norm1 = torch.nn.GroupNorm(
              num_groups=groups,
              num_channels=in_channels,
              eps=eps,
              affine=True,
          )
  
      self.conv1 = conv_cls(
          in_channels, out_channels, kernel_size=3, stride=1, padding=1
      )
  
      if temb_channels is not None:
          if self.time_embedding_norm == "default":
              self.time_emb_proj = linear_cls(
                  temb_channels, out_channels
              )
          elif self.time_embedding_norm == "scale_shift":
              self.time_emb_proj = linear_cls(
                  temb_channels, 2 * out_channels
              )
          elif (
              self.time_embedding_norm == "ada_group"
              or self.time_embedding_norm == "spatial"
          ):
              self.time_emb_proj = None
          else:
              raise ValueError(
                  f"unknown time_embedding_norm : {self.time_embedding_norm} "
              )
      else:
          self.time_emb_proj = None
  
      if self.time_embedding_norm == "ada_group":
          self.norm2 = AdaGroupNorm(
              temb_channels, out_channels, groups_out, eps=eps
          )
      elif self.time_embedding_norm == "spatial":
          self.norm2 = SpatialNorm(out_channels, temb_channels)
      else:
          self.norm2 = torch.nn.GroupNorm(
              num_groups=groups_out,
              num_channels=out_channels,
              eps=eps,
              affine=True,
          )
  
      self.dropout = torch.nn.Dropout(dropout)
      conv_2d_out_channels = conv_2d_out_channels or out_channels
      self.conv2 = conv_cls(
          out_channels,
          conv_2d_out_channels,
          kernel_size=3,
          stride=1,
          padding=1,
      )
  
      self.nonlinearity = get_activation(non_linearity)
  
      self.upsample = self.downsample = None
      if self.up:
          if kernel == "fir":
              fir_kernel = (1, 3, 3, 1)
              self.upsample = lambda x: upsample_2d(
                  x, kernel=fir_kernel
              )
          elif kernel == "sde_vp":
              self.upsample = partial(
                  F.interpolate, scale_factor=2.0, mode="nearest"
              )
          else:
              self.upsample = Upsample2D(in_channels, use_conv=False)
      elif self.down:
          if kernel == "fir":
              fir_kernel = (1, 3, 3, 1)
              self.downsample = lambda x: downsample_2d(
                  x, kernel=fir_kernel
              )
          elif kernel == "sde_vp":
              self.downsample = partial(
                  F.avg_pool2d, kernel_size=2, stride=2
              )
          else:
              self.downsample = Downsample2D(
                  in_channels, use_conv=False, padding=1, name="op"
              )
  
      self.use_in_shortcut = (
          self.in_channels != conv_2d_out_channels
          if use_in_shortcut is None
          else use_in_shortcut
      )
  
      self.conv_shortcut = None
      if self.use_in_shortcut:
          self.conv_shortcut = conv_cls(
              in_channels,
              conv_2d_out_channels,
              kernel_size=1,
              stride=1,
              padding=0,
              bias=conv_shortcut_bias,
          )
  
imports: from functools import partial
  from typing import Optional, Tuple, Union
  import torch
  import torch.nn
  import torch.nn.functional
  from ..utils import USE_PEFT_BACKEND
  from .activations import get_activation
  from .attention import AdaGroupNorm
  from .attention_processor import SpatialNorm
  from .lora import LoRACompatibleConv, LoRACompatibleLinear
label_desc: Use image node_id 1 to create a new ResnetBlock2D object from inherited base classes: nn with example: obj = ResnetBlock2D()