from enum import Enum import json class Constant: # Data CUTOUT_HOLES = 1 CUTOUT_RATIO = 0.5 # Searcher MAX_MODEL_NUM = 1000 MAX_LAYERS = 200 N_NEIGHBOURS = 8 MAX_MODEL_SIZE = (1 << 25) MAX_LAYER_WIDTH = 4096 KERNEL_LAMBDA = 1.0 BETA = 2.576 T_MIN = 0.0001 MLP_MODEL_LEN = 3 MLP_MODEL_WIDTH = 5 MODEL_LEN = 3 MODEL_WIDTH = 64 POOLING_KERNEL_SIZE = 2 DENSE_DROPOUT_RATE = 0.5 CONV_DROPOUT_RATE = 0.25 MLP_DROPOUT_RATE = 0.25 CONV_BLOCK_DISTANCE = 2 # trainer MAX_NO_IMPROVEMENT_NUM = 5 MIN_LOSS_DEC = 1e-4 class OptimizeMode(Enum): """Optimize Mode class if OptimizeMode is 'minimize', it means the tuner need to minimize the reward that received from Trial. if OptimizeMode is 'maximize', it means the tuner need to maximize the reward that received from Trial. """ Minimize = 'minimize' Maximize = 'maximize' class EarlyStop: """A class check for early stop condition. Attributes: training_losses: Record all the training loss. minimum_loss: The minimum loss we achieve so far. Used to compared to determine no improvement condition. no_improvement_count: Current no improvement count. _max_no_improvement_num: The maximum number specified. _done: Whether condition met. _min_loss_dec: A threshold for loss improvement. """ def __init__(self, max_no_improvement_num=None, min_loss_dec=None): self.training_losses = [] self.minimum_loss = None self.no_improvement_count = 0 self._max_no_improvement_num = max_no_improvement_num if max_no_improvement_num is not None \ else Constant.MAX_NO_IMPROVEMENT_NUM self._done = False self._min_loss_dec = min_loss_dec if min_loss_dec is not None else Constant.MIN_LOSS_DEC def on_train_begin(self): """Initiate the early stop condition. Call on every time the training iteration begins. """ self.training_losses = [] self.no_improvement_count = 0 self._done = False self.minimum_loss = float('inf') def on_epoch_end(self, loss): """Check the early stop condition. Call on every time the training iteration end. Args: loss: The loss function achieved by the epoch. Returns: True if condition met, otherwise False. """ self.training_losses.append(loss) if self._done and loss > (self.minimum_loss - self._min_loss_dec): return False if loss > (self.minimum_loss - self._min_loss_dec): self.no_improvement_count += 1 else: self.no_improvement_count = 0 self.minimum_loss = loss if self.no_improvement_count > self._max_no_improvement_num: self._done = True return True def save_json_result(path, data): with open(path,'a') as f: json.dump(data,f) f.write('\n')