-
Notifications
You must be signed in to change notification settings - Fork 0
Home
WARNING: This is a work in progress. The current working branch is hpo_rework. All of the following is subject to change.
Clone the repository Install the package using pip with the command pip install {RepositioryRootDir}/hpo/ To use the library three things need to be configured: the model,the data and a strategy. The following paragraphs explain how to use the library with an example of classifying 150 bird species, the data can be downloaded here: 150 Bird Data. The complete code can be found here: Bird Classification Code.
To configure the model an array needs to be created containing all the layers we wish to use, this is done by using the wrapper hpo.Layer. This class simply wraps a layer without it being created and takes all parameters and hyperparameters we wish to use and optimise. The constructs is defined as follows:
hpo.Layer(layer_name, layer_type, parameters=[], hyperparameters=[])
Parameters and hyperparmaters are wrapped in another class that has constructor is defined as follows:
hpo.Parameter(parameter_name, parameter_value, value_range=None, constraints=None):
Value range defines a list of possible values for that parameter, this is used for hyperparamters. This page will be updated to include constraints at a later date.
And can be used as follows:
hpo.Layer(layer_name="hidden_layer_dense_1", layer_type=tf.keras.layers.Dense, parameters=[ hpo.Parameter(parameter_name="activation", parameter_value="relu") ], hyperparameters=[ hpo.Parameter(parameter_name="units", parameter_value=4096, value_range=[2 ** x for x in range(4, 15)), ]), # possible values from 16 to 8192 units
Multiple layers can then be built up to build an array of layers representing the model: Create a new file called bird_classification_models.py and add the following code. The model is based off of the VGG_A model: ` import hpo import tensorflow as tf
VGG_A_11 = [ hpo.Layer(layer_name="input_layer_conv_2d", layer_type=tf.keras.layers.Conv2D, parameters=[ hpo.Parameter(parameter_name="input_shape", parameter_value=(224, 224, 3)), hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)), hpo.Parameter(parameter_name="filters", parameter_value=64), ], hyperparameters=[ ]),
hpo.Layer(layer_name="hidden_layer_max_pooling_2d_1", layer_type=tf.keras.layers.MaxPooling2d,
parameters=[
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_1", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=128)
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_max_pooling_2d_2", layer_type=tf.keras.layers.MaxPooling2d,
parameters=[
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_2", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=256)
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_3", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=256)
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_max_pooling_2d_3", layer_type=tf.keras.layers.MaxPooling2d,
parameters=[
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_4", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=512),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_5", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=512),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_max_pooling_2d_4", layer_type=tf.keras.layers.MaxPooling2d,
parameters=[
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_6", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=512),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_conv_2d_7", layer_type=tf.keras.layers.Conv2D,
parameters=[
hpo.Parameter(parameter_name="kernel_size", parameter_value=(3, 3)),
hpo.Parameter(parameter_name="filters", parameter_value=512),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_max_pooling_2d_6", layer_type=tf.keras.layers.MaxPooling2d,
parameters=[
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_dense_1", layer_type=tf.keras.layers.Dense,
parameters=[
hpo.Parameter(parameter_name="units", parameter_value=4096),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_dense_1", layer_type=tf.keras.layers.Dense,
parameters=[
hpo.Parameter(parameter_name="units", parameter_value=4096),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="hidden_layer_dense_2", layer_type=tf.keras.layers.Dense,
parameters=[
hpo.Parameter(parameter_name="units", parameter_value=4096),
hpo.Parameter(parameter_name="activation", parameter_value="relu")
],
hyperparameters=[
]),
hpo.Layer(layer_name="output_layer_dense", layer_type=tf.keras.layers.Dense,
parameters=[
hpo.Parameter(parameter_name="units", parameter_value=150),
hpo.Parameter(parameter_name="activation", parameter_value="softmax")
],
hyperparameters=[
])
]
Now to actually create a model configuration we need to use thehpo.ModelConfiguration class`. The constructor of which is defined as:
hpo.ModelConfiguration(optimiser, layers, loss_function, number_of_epochs)
The first parameter is wrapped by another class:
hpo.Optimiser(optimiser_type, parameters=[], hyperparameters=[], optimiser_name="Optimiser")
To create a model configuration we first must define an optimiser:
optimiser = hpo.Optimiser(optimiser_name="optimiser_adam", optimiser_type=tf.keras.optimizers.Adam, hyperparameters=[ hpo.Parameter(parameter_name="learning_rate", parameter_value=0.001, value_range=[1 * (10 ** n) for n in range(0, -7, -1)]) ])
Then we can create our configuration:
model_configuration = hpo.ModelConfiguration(optimiser=optimiser, layers=model_configurations.VGG_A_11, number_of_epochs=10)
Next we need to create a class to wrap our data, create a new file bird_classification_data.py. Then create a class as follows:
class BirdData(hpo.Data):
And define a constructor as follows:
` def init(self, data_dir, cache_path, training_batch_size, validation_batch_size, test_batch_size): super().init()
self._data_dir = data_dir
self._cache_path = cache_path
self._training_batch_size = training_batch_size
self._validation_batch_size = validation_batch_size
self._test_batch_size = test_batch_size
self._training_image_count = 0
self._validation_image_count = 0
self._test_image_count = 0
self._class_labels = self._get_class_labels()
self._training_data = None
self._validation_data = None
self._test_data = None`