code: def process_step(self, step_counter):
      # Replace with GPU function?
      sample_latent = np.random.normal(
          size=[self.training_batch_size, self.latent_size]
      )
      reference_data = next(self.training_data_generator)[
          self.input_data
      ]
  
      # Optimize!
  
      _, g_loss = self.sess.run(
          [self.opti_G, self.G_loss],
          feed_dict={
              self.reference_images: reference_data,
              self.latent: sample_latent,
          },
      )
      _, d_loss, d_origin_loss = self.sess.run(
          [self.opti_D, self.D_loss, self.d_origin_loss],
          feed_dict={
              self.reference_images: reference_data,
              self.latent: sample_latent,
          },
      )
  
      # This is a little weird -- it only records loss on discriminator steps.
      self.log(
          [g_loss, d_loss, d_origin_loss],
          headers=[
              "Generator Loss",
              "WP Discriminator Loss",
              "Discriminator Loss",
          ],
          verbose=self.hyperverbose,
      )
      step_counter.set_description(
          "Generator Loss: {0:.5f}".format(g_loss)
          + " Discriminator Loss: {0:.5f}".format(d_loss)
      )
  
      return
  
file_path: DeepNeuro/deepneuro/models/gan.py
imports: import numpy
  import tensorflow
  import os
  from deepneuro.models.tensorflow_model import TensorFlowModel
  from deepneuro.utilities.util import add_parameter
  from deepneuro.models.blocks import generator, discriminator
  from deepneuro.models.cost_functions import wasserstein_loss
label_desc: Use image node_id 3 for calling the GAN obj's underlying member method code with example usage: obj.process_step(step_counter) without return types