code: def after_run(self, run_context, run_values):
      if self.global_step_tensor is not None:
          self.step = run_values.results["global_step"]
      else:
          self.step += 1
  
      if self.step % self.every_n_iter == 0:
          _prev_log_level = tf.compat.v1.logging.get_verbosity()
          tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
  
          if self.eval_fns is None:
              result = self.model.evaluate(
                  input_fn=pandas_input_fn(
                      df=self.true_df,
                      y_col=self.y_col,
                      batch_size=self.batch_size,
                  )
              )["average_loss"]
              self._log("validation_loss", result)
          else:
              predictions = list(
                  itertools.islice(
                      self.model.predict(
                          input_fn=pandas_input_fn(
                              df=self.eval_df,
                              batch_size=self.batch_size,
                          )
                      ),
                      len(self.eval_df),
                  )
              )
              prediction_df = self.eval_df.copy()
              prediction_df["prediction"] = [
                  p["predictions"][0] for p in predictions
              ]
              for fn in self.eval_fns:
                  result = fn(
                      self.true_df, prediction_df, **self.eval_kwargs
                  )
                  self._log(fn.__name__, result)
  
          tf.compat.v1.logging.set_verbosity(_prev_log_level)
  
imports: import itertools
  import numpy
  import tensorflow
  from tensorflow_estimator.python.estimator.export.export import build_supervised_input_receiver_fn_from_input_fn
label_desc: Use image node_id 4 for calling the _TrainLogHook obj's underlying member method code with example usage: obj.after_run(run_context, run_values) without return types