code: def on_validation_epoch_end(self, trainer, pl_module):
      node_emb = th.cat(self.val_outputs, 0)
      g = trainer.datamodule.g
      labels = g.ndata["labels"]
      f1_micro, f1_macro = compute_acc(
          node_emb,
          labels,
          trainer.datamodule.train_nid,
          trainer.datamodule.val_nid,
          trainer.datamodule.test_nid,
      )
      pl_module.log("val_f1_micro", f1_micro)
  
imports: import argparse
  import glob
  import os
  import sys
  import time
  import dgl
  import dgl.function
  import dgl.nn.pytorch
  import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  import torch.optim
  import tqdm
  from model import compute_acc_unsupervised, SAGE
  from negative_sampler import NegativeSampler
  from pytorch_lightning import LightningDataModule, LightningModule, Trainer
  from pytorch_lightning.callbacks import Callback, ModelCheckpoint
  from load_graph import inductive_split, load_ogb, load_reddit
label_desc: Use image node_id 3 for calling the UnsupervisedClassification obj's underlying member method code with example usage: obj.on_validation_epoch_end(trainer, pl_module) without return types