code: def generate(self, runPath, epoch):
      N = 8
      samples = super(CUB_Image_Sentence_ft, self).generate(N)
      samples[0] = self.vaes[0].unproject(
          samples[0], search_split="train"
      )
      images, captions = [sample.data.cpu() for sample in samples]
      captions = self._sent_preprocess(captions)
      fig = plt.figure(figsize=(8, 6))
      for i, (image, caption) in enumerate(zip(images, captions)):
          fig = self._imshow(image, caption, i, fig, N)
  
      plt.savefig("{}/gen_samples_{:03d}.png".format(runPath, epoch))
      plt.close()
  
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 4 for calling the CUB_Image_Sentence_ft obj's underlying member method code with example usage: obj.generate(runPath, epoch) without return types