class_docstr: This class encapsulates the parameters (neural networks) and models & guides needed to train a
  semi-supervised variational auto-encoder on the MNIST image dataset
  
  :param output_size: size of the tensor representing the class label (10 for MNIST since
                      we represent the class labels as a one-hot vector with 10 components)
  :param input_size: size of the tensor representing the image (28*28 = 784 for our MNIST dataset
                     since we flatten the images and scale the pixels to be in [0,1])
  :param z_dim: size of the tensor representing the latent random variable z
                (handwriting style for our MNIST dataset)
  :param hidden_layers: a tuple (or list) of MLP layers to be used in the neural networks
                        representing the parameters of the distributions in our model
  :param use_cuda: use GPUs for faster training
  :param aux_loss_multiplier: the multiplier to use with the auxiliary loss
docstr: this model is used to add an auxiliary (supervised) loss as described in the
  Kingma et al., "Semi-Supervised Learning with Deep Generative Models".
docstr_tok: ["this","model","is","used","to","add","an","auxiliary","(","supervised",")","loss","as","described","in","the","Kingma","et","al.",",","``","Semi-Supervised","Learning","with","Deep","Generative","Models","''","."]
code: def model_classify(self, xs, ys=None):
      """
      this model is used to add an auxiliary (supervised) loss as described in the
      Kingma et al., "Semi-Supervised Learning with Deep Generative Models".
      """
      # register all pytorch (sub)modules with pyro
      pyro.module("ss_vae", self)
  
      # inform Pyro that the variables in the batch of xs, ys are conditionally independent
      with pyro.plate("data"):
          # this here is the extra term to yield an auxiliary loss that we do gradient descent on
          if ys is not None:
              alpha = self.encoder_y(xs)
              with pyro.poutine.scale(scale=self.aux_loss_multiplier):
                  pyro.sample(
                      "y_aux", dist.OneHotCategorical(alpha), obs=ys
                  )
  
imports: import argparse
  import torch
  import torch.nn
  from utils.custom_mlp import MLP, Exp
  from utils.mnist_cached import MNISTCached, mkdir_p, setup_data_loaders
  from utils.vae_plots import mnist_test_tsne_ssvae, plot_conditional_samples_ssvae
  from visdom import Visdom
  import pyro
  import pyro.distributions
  from pyro.contrib.examples.util import print_and_log
  from pyro.infer import SVI, JitTrace_ELBO, JitTraceEnum_ELBO, Trace_ELBO, TraceEnum_ELBO, config_enumerate
  from pyro.optim import Adam
label_desc: Use image node_id 6 for calling the SSVAE obj's underlying member method code with example usage: obj.model_classify(xs, ys) without return types