forked from p7px8vou9/AI_learning
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
3.0 KiB
80 lines
3.0 KiB
# search_hyperparams.py
|
|
# ---------------------
|
|
# Licensing Information: You are free to use or extend these projects for
|
|
# educational purposes provided that (1) you do not distribute or publish
|
|
# solutions, (2) you retain this notice, and (3) you provide clear
|
|
# attribution to UC Berkeley, including a link to http://ai.berkeley.edu.
|
|
#
|
|
# Attribution Information: The Pacman AI projects were developed at UC Berkeley.
|
|
# The core projects and autograders were primarily created by John DeNero
|
|
# (denero@cs.berkeley.edu) and Dan Klein (klein@cs.berkeley.edu).
|
|
# Student side autograding was added by Brad Miller, Nick Hay, and
|
|
# Pieter Abbeel (pabbeel@cs.berkeley.edu).
|
|
|
|
|
|
import numpy as np
|
|
import solvers
|
|
import util
|
|
|
|
|
|
def search_hyperparams(train_data, train_labels, val_data, val_labels,
|
|
learning_rates, momentums, batch_sizes, iterations,
|
|
model_class, init_param_values=None, use_bn=False):
|
|
"""
|
|
Question 8: Evaluate various setups of hyperparameter and find the best one.
|
|
|
|
Args:
|
|
learning rate, momentums, batch_sizes are lists of the same length.
|
|
The N-th elements from the lists form the N-th hyperparameter tuple.
|
|
|
|
Returns:
|
|
A model that corresponds to the best hyperparameter tuple, and the index
|
|
of the best hyperparameter tuple
|
|
|
|
Your implementation will train a model using each hyperparameter tuple and
|
|
compares their accuracy on validation set to pick the best one.
|
|
|
|
You must use MinibatchStochasticGradientDescentSolver.
|
|
|
|
Useful methods:
|
|
solver.solve(...)
|
|
model.accuracy(...)
|
|
"""
|
|
# Check length of inputs all the same
|
|
hyperparams = [learning_rates, momentums, batch_sizes]
|
|
for hyperparam in hyperparams:
|
|
if len(hyperparam) != len(hyperparams[0]):
|
|
raise ValueError('The hyperparameter lists need to be equal in length')
|
|
hyperparams = zip(*hyperparams)
|
|
|
|
# Initialize the models
|
|
models = []
|
|
for learning_rate, momentum, batch_size in hyperparams:
|
|
try:
|
|
model = model_class(use_batchnorm=use_bn)
|
|
except:
|
|
model = model_class()
|
|
if init_param_values is None:
|
|
init_param_values = model.get_param_values()
|
|
else:
|
|
model.set_param_values(init_param_values)
|
|
models.append(model)
|
|
|
|
# Loop over hyperparams
|
|
best_hyperparams = None
|
|
index = 1
|
|
best_model = None
|
|
max_accuracy = float("-inf")
|
|
for model, (learning_rate, momentum, batch_size) in zip(models, hyperparams):
|
|
"*** YOUR CODE HERE ***"
|
|
solver = solvers.MinibatchStochasticGradientDescentSolver(learning_rate, iterations, batch_size, momentum)
|
|
train_losses, val_losses = solver.solve(train_data, train_labels, val_data, val_labels, model)
|
|
accuracy = model.accuracy(val_data, val_labels)
|
|
if accuracy > max_accuracy:
|
|
max_accuracy = accuracy
|
|
best_model = model
|
|
best_hyperparams = index
|
|
index += 1
|
|
return best_model, best_hyperparams
|
|
|