Source code for deepaugment.objective
# (C) 2019 Baris Ozmen <hbaristr@gmail.com>
import pandas as pd
import numpy as np
import sys
from os.path import dirname, realpath
file_path = realpath(__file__)
dir_of_file = dirname(file_path)
sys.path.insert(0, dir_of_file)
from augmenter import augment_by_policy
from lib.helpers import log_and_print
[docs]class Objective:
"""Objective class for the controller
"""
def __init__(self, data, child_model, notebook, config):
self.data = data
self.child_model = child_model
self.opt_samples = config["opt_samples"]
self.opt_last_n_epochs = config["opt_last_n_epochs"]
self.notebook = notebook
self.logging = config["logging"]
[docs] def evaluate(self, trial_no, trial_hyperparams):
"""Evaluates objective function
Trains the child model k times with same augmentation hyperparameters.
k is determined by the user by `opt_samples` argument.
Args:
trial_no (int): no of trial. needed for recording to notebook
trial_hyperparams (list)
Returns:
float: trial-cost = 1 - avg. rewards from samples
"""
augmented_data = augment_by_policy(
self.data["X_train"], self.data["y_train"], *trial_hyperparams
)
sample_rewards = []
for sample_no in range(1, self.opt_samples + 1):
self.child_model.load_pre_augment_weights()
# TRAIN
history = self.child_model.fit(self.data, augmented_data)
#
reward = self.calculate_reward(history)
sample_rewards.append(reward)
self.notebook.record(
trial_no, trial_hyperparams, sample_no, reward, history
)
trial_cost = 1 - np.mean(sample_rewards)
self.notebook.save()
log_and_print(
f"{str(trial_no)}, {str(trial_cost)}, {str(trial_hyperparams)}",
self.logging,
)
return trial_cost
[docs] def calculate_reward(self, history):
"""Calculates reward for the history.
Reward is mean of largest n validation accuracies which are not overfitting.
n is determined by the user by `opt_last_n_epochs` argument. A validation
accuracy is considered as overfitting if the training accuracy in the same
epoch is larger by 0.05
Args:
history (dict): dictionary of loss and accuracy
Returns:
float: reward
"""
history_df = pd.DataFrame(history)
history_df["acc_overfit"] = history_df["acc"] - history_df["val_acc"]
reward = (
history_df[history_df["acc_overfit"] <= 0.05]["val_acc"]
.nlargest(self.opt_last_n_epochs)
.mean()
)
return reward