code: def __init__(self, params):
      super(CUB_Image_Sentence_ft, self).__init__(
          dist.Normal, params, CUB_Image_ft, CUB_Sentence_ft
      )
      grad = {"requires_grad": params.learn_prior}
      self._pz_params = nn.ParameterList(
          [
              nn.Parameter(
                  torch.zeros(1, params.latent_dim), requires_grad=False
              ),  # mu
              nn.Parameter(
                  torch.zeros(1, params.latent_dim), **grad
              ),  # logvar
          ]
      )
      self.vaes[0].llik_scaling = (
          self.vaes[1].maxSentLen / prod(self.vaes[0].dataSize)
          if params.llik_scaling == 0
          else params.llik_scaling
      )
  
      for vae in self.vaes:
          vae._pz_params = self._pz_params
      self.modelName = "cubISft"
  
      self.i2w = self.vaes[1].load_vocab()
  
imports: import matplotlib.pyplot
  import torch.distributions
  import torch.nn
  import torch.nn.functional
  import torch.utils.data
  from numpy import sqrt, prod
  from torch.utils.data import DataLoader
  from torchnet.dataset import TensorDataset, ResampleDataset
  from torchvision.utils import save_image, make_grid
  from utils import Constants
  from vis import plot_embeddings, plot_kls_df
  from .mmvae import MMVAE
  from .vae_cub_image_ft import CUB_Image_ft
  from .vae_cub_sent_ft import CUB_Sentence_ft
label_desc: Use image node_id 1 to create a new CUB_Image_Sentence_ft object from inherited base classes: MMVAE with example: obj = CUB_Image_Sentence_ft(params)