code: def analyse(self, data, K):
      self.eval()
      with torch.no_grad():
          qz_x, _, zs = self.forward(data, K=K)
          pz = self.pz(*self.pz_params)
          zss = [
              pz.sample(torch.Size([K, data.size(0)])).view(
                  -1, pz.batch_shape[-1]
              ),
              zs.view(-1, zs.size(-1)),
          ]
          zsl = [
              torch.zeros(zs.size(0)).fill_(i)
              for i, zs in enumerate(zss)
          ]
          kls_df = tensors_to_df(
              [kl_divergence(qz_x, pz).cpu().numpy()],
              head="KL",
              keys=[r"KL$(q(z|x)\,||\,p(z))$"],
              ax_names=["Dimensions", r"KL$(q\,||\,p)$"],
          )
      return (
          embed_umap(torch.cat(zss, 0).cpu().numpy()),
          torch.cat(zsl, 0).cpu().numpy(),
          kls_df,
      )
  
file_path: mmvae/src/models/vae.py
imports: import torch
  import torch.nn
  from utils import get_mean, kl_divergence
  from vis import embed_umap, tensors_to_df
label_desc: Use image node_id 8 for calling the VAE obj's underlying member method code with example usage: obj.analyse(data, K) and returns: embed_umap,  torch,  kls_df