class_docstr: Autoencoder Decoder model.
  
  Args:
      out_channels (int): number of convolution output channels
      img_size (tuple): size of input images
code: def __init__(
      self, out_channels, padding, img_size, *args, **kwargs
  ) -> None:
      super().__init__(*args, **kwargs)
      self.img_size = img_size
      self.last_upsample = (
          int(img_size[0] / 4) if padding else int(img_size[0] / 4) - 8,
          int(img_size[1] / 4) if padding else int(img_size[1] / 4) - 8,
      )
      self.deconv1 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv2 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv3 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv4 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv5 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv6 = nn.Conv2d(
          64, 64, kernel_size=4, stride=1, padding=2
      )
      self.deconv7 = nn.Conv2d(
          64, 64, kernel_size=3, stride=1, padding=1
      )
      self.deconv8 = nn.Conv2d(
          64, out_channels, kernel_size=3, stride=1, padding=1
      )
      self.dropout1 = nn.Dropout(p=0.2)
      self.dropout2 = nn.Dropout(p=0.2)
      self.dropout3 = nn.Dropout(p=0.2)
      self.dropout4 = nn.Dropout(p=0.2)
      self.dropout5 = nn.Dropout(p=0.2)
      self.dropout6 = nn.Dropout(p=0.2)
  
imports: from __future__ import annotations
  import logging
  import random
  from enum import Enum
  import torch
  import torch.nn.functional
  from torch import Tensor, nn
  from torchvision import transforms
label_desc: Use image node_id 1 to create a new Decoder object from inherited base classes: nn with example: obj = Decoder(out_channels, padding, img_size)