class_docstr: Dataset class to provide (augmented) correctly prepared training samples corresponding to standard DML literature.
  This includes normalizing to ImageNet-standards, and Random & Resized cropping of shapes 224 for ResNet50 and 227 for
  GoogLeNet during Training. During validation, only resizing to 256 or center cropping to 224/227 is performed.
docstr: Dataset Init-Function.
  
  Args:
      image_dict:         dict, Dictionary of shape {class_idx:[list of paths to images belong to this class] ...} providing all the training paths and classes.
      opt:                argparse.Namespace, contains all training-specific parameters.
      samples_per_class:  Number of samples to draw from one class before moving to the next when filling the batch.
      is_validation:      If is true, dataset properties for validation/testing are used instead of ones for training.
  Returns:
      Nothing!
docstr_tok: ["Dataset","Init-Function",".","Args",":","image_dict",":","dict",",","Dictionary","of","shape","{","class_idx",":","[","list","of","paths","to","images","belong","to","this","class","]","...","}","providing","all","the","training","paths","and","classes",".","opt",":","argparse.Namespace",",","contains","all","training-specific","parameters",".","samples_per_class",":","Number","of","samples","to","draw","from","one","class","before","moving","to","the","next","when","filling","the","batch",".","is_validation",":","If","is","true",",","dataset","properties","for","validation\/testing","are","used","instead","of","ones","for","training",".","Returns",":","Nothing","!"]
code: def __init__(
      self, image_dict, opt, samples_per_class=8, is_validation=False
  ):
      """
      Dataset Init-Function.
  
      Args:
          image_dict:         dict, Dictionary of shape {class_idx:[list of paths to images belong to this class] ...} providing all the training paths and classes.
          opt:                argparse.Namespace, contains all training-specific parameters.
          samples_per_class:  Number of samples to draw from one class before moving to the next when filling the batch.
          is_validation:      If is true, dataset properties for validation/testing are used instead of ones for training.
      Returns:
          Nothing!
      """
      # Define length of dataset
      self.n_files = np.sum(
          [len(image_dict[key]) for key in image_dict.keys()]
      )
  
      self.is_validation = is_validation
  
      self.pars = opt
      self.image_dict = image_dict
  
      self.avail_classes = sorted(list(self.image_dict.keys()))
  
      # Convert image dictionary from classname:content to class_idx:content, because the initial indices are not necessarily from 0 - <n_classes>.
      self.image_dict = {
          i: self.image_dict[key]
          for i, key in enumerate(self.avail_classes)
      }
      self.avail_classes = sorted(list(self.image_dict.keys()))
  
      # Init. properties that are used when filling up batches.
      if not self.is_validation:
          self.samples_per_class = samples_per_class
          # Select current class to sample images from up to <samples_per_class>
          self.current_class = np.random.randint(
              len(self.avail_classes)
          )
          self.classes_visited = [
              self.current_class,
              self.current_class,
          ]
          self.n_samples_drawn = 0
  
      # Data augmentation/processing methods.
      normalize = transforms.Normalize(
          mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]
      )
      transf_list = []
      if not self.is_validation:
          transf_list.extend(
              [
                  transforms.RandomResizedCrop(size=224)
                  if opt.arch == "resnet50"
                  else transforms.RandomResizedCrop(size=227),
                  transforms.RandomHorizontalFlip(0.5),
              ]
          )
      else:
          transf_list.extend(
              [
                  transforms.Resize(256),
                  transforms.CenterCrop(224)
                  if opt.arch == "resnet50"
                  else transforms.CenterCrop(227),
              ]
          )
  
      transf_list.extend([transforms.ToTensor(), normalize])
      self.transform = transforms.Compose(transf_list)
  
      # Convert Image-Dict to list of (image_path, image_class). Allows for easier direct sampling.
      self.image_list = [
          [(x, key) for x in self.image_dict[key]]
          for key in self.image_dict.keys()
      ]
      self.image_list = [x for y in self.image_list for x in y]
  
      # Flag that denotes if dataset is called for the first time.
      self.is_init = True
  
imports: import pickle
  import warnings
  from numpy.core.arrayprint import IntegerFormat
  import copy
  import os
  import random
  import numpy
  import pandas
  import torch
  from PIL import Image
  from torch.utils.data import Dataset
  from torchvision import transforms
label_desc: Use image node_id 1 to create a new BaseTripletDataset object from inherited base classes: Dataset with example: obj = BaseTripletDataset(image_dict, opt, samples_per_class, is_validation)