class_docstr: This class provides a collection of logging properties that are useful for training.
  These include setting the save folder, in which progression of training/testing metrics is visualized,
  csv log-files are stored, sample recoveries are plotted and an internal data saver.
class_docstr_tok: ["This","class","provides","a","collection","of","logging","properties","that","are","useful","for","training",".","These","include","setting","the","save","folder",",","in","which","progression","of","training\/testing","metrics","is","visualized",",","csv","log-files","are","stored",",","sample","recoveries","are","plotted","and","an","internal","data","saver","."]
docstr: Actually log new values in csv and Progress Saver dict internally.
  Args:
      main_keys:      Main key in which data will be stored. Normally is either 'train' for training metrics or 'val' for validation metrics.
      metric_keys:    Needs to follow the list length of self.progress_saver[main_key(s)]. List of metric keys that are extended with new values.
      values:         Needs to be a list of the same structure as metric_keys. Actual values that are appended.
docstr_tok: ["Actually","log","new","values","in","csv","and","Progress","Saver","dict","internally",".","Args",":","main_keys",":","Main","key","in","which","data","will","be","stored",".","Normally","is","either","'train","'","for","training","metrics","or","'val","'","for","validation","metrics",".","metric_keys",":","Needs","to","follow","the","list","length","of","self.progress_saver","[","main_key","(","s",")","]",".","List","of","metric","keys","that","are","extended","with","new","values",".","values",":","Needs","to","be","a","list","of","the","same","structure","as","metric_keys",".","Actual","values","that","are","appended","."]
code: def log(self, main_keys, metric_keys, values):
      """
      Actually log new values in csv and Progress Saver dict internally.
      Args:
          main_keys:      Main key in which data will be stored. Normally is either 'train' for training metrics or 'val' for validation metrics.
          metric_keys:    Needs to follow the list length of self.progress_saver[main_key(s)]. List of metric keys that are extended with new values.
          values:         Needs to be a list of the same structure as metric_keys. Actual values that are appended.
      """
      if not isinstance(main_keys, list):
          main_keys = [main_keys]
      if not isinstance(metric_keys, list):
          metric_keys = [metric_keys]
      if not isinstance(values, list):
          values = [values]
  
      # Log data to progress saver dict.
      for main_key in main_keys:
          for value, metric_key in zip(values, metric_keys):
              self.progress_saver[main_key][metric_key].append(value)
  
      # Append data to csv.
      self.csv_loggers[main_key].log(values)
  
imports: import warnings
  import csv
  import datetime
  import os
  import pickle
  import faiss
  import matplotlib.pyplot
  import numpy
  import torch
  from PIL import Image
  from sklearn import metrics
  from torch import nn
  from tqdm import tqdm
  import pdb
label_desc: Use image node_id 3 for calling the LOGGER obj's underlying member method code with example usage: obj.log(main_keys, metric_keys, values) without return types