Example #1
0
class HyperparameterTuner(object):
    def __init__(self, sess, hidden_layers, hidden_units, num_perms, trials,
                 epochs):
        self.hidden_layers = hidden_layers
        self.hidden_units = hidden_units
        self.num_perms = num_perms
        self.epochs = epochs
        self.task_list = self.create_permuted_mnist_task(num_perms)
        self.trial_learning_rates = [
            PRNG.uniform(1e-4, 1e-3) for _ in range(0, trials)
        ]
        self.best_parameters = []
        self.sess = sess
        self.classifier = Classifier(
            num_class=10,
            num_features=784,
            fc_hidden_units=[hidden_units for _ in range(hidden_layers)],
            apply_dropout=True)

    def search(self):
        for t in range(0, self.num_perms):
            queue = PriorityQueue()
            for learning_rate in self.trial_learning_rates:
                self.train_on_task(t, learning_rate, queue)
            self.best_parameters.append(queue.get())
            self.evaluate()

    def evaluate(self):
        accuracies = []
        for parameters in self.best_parameters:
            accuracy = self.classifier.test(
                sess=self.sess,
                model_name=parameters[1],
                batch_xs=self.task_list[0].test.images,
                batch_ys=self.task_list[0].test.labels)
            accuracies.append(accuracy)
        print(accuracies)

    def train_on_task(self, t, lr, queue):
        model_name = self.file_name(lr, t)
        dataset_train = self.task_list[t].train
        dataset_lagged = self.task_list[t - 1] if t > 0 else None
        model_init_name = self.best_parameters[t - 1][1] if t > 0 else None
        self.classifier.train(sess=self.sess,
                              model_name=model_name,
                              model_init_name=model_init_name,
                              dataset=dataset_train,
                              dataset_lagged=dataset_lagged,
                              num_updates=(55000 // MINI_BATCH_SIZE) *
                              self.epochs,
                              mini_batch_size=MINI_BATCH_SIZE,
                              log_frequency=LOG_FREQUENCY,
                              fisher_multiplier=1.0 / lr,
                              learning_rate=lr)
        accuracy = self.classifier.test(
            sess=self.sess,
            model_name=model_name,
            batch_xs=self.task_list[0].validation.images,
            batch_ys=self.task_list[0].validation.labels)
        queue.put((-accuracy, model_name))

    def create_permuted_mnist_task(self, num_datasets):
        mnist = read_data_sets("MNIST_data/", one_hot=True)
        task_list = [mnist]
        for seed in range(1, num_datasets):
            task_list.append(self.permute(mnist, seed))
        return task_list

    @staticmethod
    def permute(task, seed):
        np.random.seed(seed)
        perm = np.random.permutation(task.train._images.shape[1])
        permuted = deepcopy(task)
        permuted.train._images = permuted.train._images[:, perm]
        permuted.test._images = permuted.test._images[:, perm]
        permuted.validation._images = permuted.validation._images[:, perm]
        return permuted

    def file_name(self, lr, t):
        return 'layers=%d,hidden=%d,lr=%.5f,multiplier=%.2f,mbsize=%d,epochs=%d,perm=%d' \
               % (self.hidden_layers, self.hidden_units, lr, 1 / lr, MINI_BATCH_SIZE, self.epochs, t)
k = 1
for train, test in sets:
    if '$' in classifier.selected_split_name:
        classifier.selected_split_name = str(
            k) + classifier.selected_split_name[1:]
        k += 1
    classifier.create_dictionary(train)
    classifier.save_word_dictionary()
    # print(classifier.hash_dictionary)
    for lr in [0.6]:  # [0.1, 0.2, 0.25, 0.4, 0.6, 0.75, 0.8, 1]
        classifier.create_weights_array(1)
        print('{} \tLearning Rate= {}\tSplit Set: {}'.format(
            'perceptron', lr, classifier.selected_split_name))
        classifier.train(
            train,
            test,
            classifier='perceptron',
            list_iteration=[10, 100, 1000],  # [10, 100, 1000, 5000]
            learning_rate=lr)
        print('history: {}'.format(classifier.history))

# # winnow
# k=1
# for train, test in sets:
#     if '$' in classifier.selected_split_name:
#         classifier.selected_split_name = str(k)+classifier.selected_split_name[1:]
#         k+=1
#     classifier.create_dictionary(train)
#     for lr in [0.1, 0.2, 0.25, 0.4, 0.6, 0.75, 0.8, 1]:
#         classifier.create_weights_array(1)
#         print('{} \tLearning Rate= {}\tSplit Set: {}'.format('winnow', lr, classifier.selected_split_name))
#         classifier.train(train, test, classifier='winnow', list_iteration=[10, 100, 1000, 5000], learning_rate=lr)