code: def configure_optimizers(self):
      optimizer_d = torch.optim.Adam(
          self.model.discriminator.parameters(),
          lr=self.hparams.d_lr,
          betas=(0.5, 0.999),
      )
      optimizer_attr_d = torch.optim.Adam(
          self.model.attr_discriminator.parameters(),
          lr=self.hparams.attr_d_lr,
          betas=(0.5, 0.999),
      )
      optimizer_g = torch.optim.Adam(
          self.model.generator.parameters(),
          lr=self.hparams.g_lr,
          betas=(0.5, 0.999),
      )
      return optimizer_d, optimizer_attr_d, optimizer_g
  
imports: import os
  import numpy
  import sys
  from collections import OrderedDict
  import math
  import torch
  import torch.nn.functional
  from torch import nn
  from pytorch_lightning import LightningModule
  from pytorch_lightning import seed_everything
  from .doppelganger import DoppelGANger
  from .network import RNNInitialStateType
  from .loss import doppelganger_loss
  from .util import gen_attribute_input_noise, gen_feature_input_noise, gen_feature_input_data_free, renormalize_per_sample
label_desc: Use image node_id 4 for calling the DoppelGANger_pl obj's underlying member method code with example usage: obj.configure_optimizers() and returns: optimizer_d,  optimizer_attr_d,  optimizer_g