Skip to content
robert bennett edited this page Mar 18, 2020 · 1 revision

WARNING: This is a work in progress. The current working branch is hpo_rework. All of the following is subject to change.

Using the library

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.

Defining the model.

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`