code: def validation(self, epoch):
      self.metric.reset()
      tbar = tqdm(self.eval_data)
      for i, (data, target) in enumerate(tbar):
          outputs = self.evaluator(data.astype(args.dtype, copy=False))
          outputs = [x[0] for x in outputs]
          targets = mx.gluon.utils.split_and_load(
              target, args.ctx, even_split=False
          )
          self.metric.update(targets, outputs)
          pixAcc, mIoU = self.metric.get()
          tbar.set_description(
              "Epoch %d, validation pixAcc: %.3f, mIoU: %.3f"
              % (epoch, pixAcc, mIoU)
          )
          mx.nd.waitall()
      self.logger.info(
          "Epoch %d validation pixAcc: %.3f, mIoU: %.3f"
          % (epoch, pixAcc, mIoU)
      )
      save_checkpoint(self.net.module, self.args, epoch, mIoU, False)
  
imports: import os
  import logging
  import shutil
  import argparse
  import numpy
  from tqdm import tqdm
  import mxnet
  from mxnet import gluon, autograd
  from mxnet.gluon.data.vision import transforms
  import gluoncv
  from gluoncv.loss import *
  from gluoncv.utils import makedirs, LRScheduler, LRSequential
  from gluoncv.model_zoo.segbase import *
  from gluoncv.model_zoo import get_model
  from gluoncv.utils.parallel import *
  from gluoncv.data import get_segmentation_dataset
label_desc: Use image node_id 3 for calling the Trainer obj's underlying member method code with example usage: obj.validation(epoch) without return types