code: def __init__(
      self,
      *,
      in_channels,
      out_channels=None,
      conv_shortcut=False,
      dropout,
      temb_channels=512,
  ):
      super().__init__()
      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.norm1 = Normalize(in_channels)
      self.conv1 = torch.nn.Conv2d(
          in_channels, out_channels, kernel_size=3, stride=1, padding=1
      )
      if temb_channels > 0:
          self.temb_proj = torch.nn.Linear(temb_channels, out_channels)
      self.norm2 = Normalize(out_channels)
      self.dropout = torch.nn.Dropout(dropout)
      self.conv2 = torch.nn.Conv2d(
          out_channels, out_channels, kernel_size=3, stride=1, padding=1
      )
      if self.in_channels != self.out_channels:
          if self.use_conv_shortcut:
              self.conv_shortcut = torch.nn.Conv2d(
                  in_channels,
                  out_channels,
                  kernel_size=3,
                  stride=1,
                  padding=1,
              )
          else:
              self.nin_shortcut = torch.nn.Conv2d(
                  in_channels,
                  out_channels,
                  kernel_size=1,
                  stride=1,
                  padding=0,
              )
  
imports: import logging
  import math
  from typing import Any, Callable, Optional
  import numpy
  import torch
  import torch.nn
  from einops import rearrange
  from packaging import version
  from ...modules.attention import LinearAttention, MemoryEfficientCrossAttention
label_desc: Use image node_id 1 to create a new ResnetBlock object from inherited base classes: nn with example: obj = ResnetBlock()