Using the machine learning library

Let's look at an example of how to use the Fetch.ai machine learning library to train a neural network in a standalone application. This example will predict house prices for the Boston Housing Dataset, which can be downloaded from here.

The implementation is based on the Etch language, which is also used to write smart contracts on the Fetch.ai ledger; you saw a very brief example in the previous section. Instructions to set up an Etch development environment can be found here.

Loading input data

An Etch program running outside of a ledger environment needs a main() function as its entry point.

Note

Please include all the code snippets listed below inside the main() function.

Since the input is provided via multiple CSV files, the main() function firstly has to check the correct number of files is provided, then load the input data from them:

function main()

    if (System.Argc() != 5)
      print("Usage: SCRIPT_FILE -- PATH/TO/BOSTON_TRAIN_DATA.CSV PATH/TO/BOSTON_TRAIN_LABELS.CSV PATH/TO/BOSTON_TEST_DATA.CSV PATH/TO/BOSTON_TEST_LABELS.CSV ");
      return;
    endif

    var data = readCSV(System.Argv(1));
    var label = readCSV(System.Argv(2));
    var test_data = readCSV(System.Argv(3));
    var test_label = readCSV(System.Argv(4));

endfunction

Setting up the model

We then create a Model type and set a flag on it that describes what kind of Model we want. A sequential model allows us to manually add layers specifying:

  • Type: dense in this example refers to a fully-connected layer where every neuron in the layer is connected to every input and every output.
  • Input size: must match the data for the first layer
  • Neurons in layer / output size: must match the label size for the final layer
  • Activation type (optional): here we use a rectified linear unit for the first two layers, and no activation for the final layer

Finally, we compile the model using the mse (mean squared error) loss function, and the adam optimiser.

    var model = Model("sequential");
    model.add("dense", 13u64, 10u64, "relu");
    model.add("dense", 10u64, 10u64, "relu");
    model.add("dense", 10u64, 1u64);
    model.compile("mse", "adam");

Training and evaluating the model

Training the model once set up is easy: we just call fit with the data, labels, and chosen batch size.

    var batch_size = 10u64;
    model.fit(data, label, batch_size);

Evaluating the model will return the training loss by default, but other metrics may be specified.

    var loss = model.evaluate();

Making predictions on the model

Finally, we make house price predictions by passing in the test data. Since test_data contains input data for multiple houses, the output tensor contains multiple predictions.

    var predictions = model.predict(test_data);

Running the script

The script can be run from the root of the ledger folder, passing the input files as arguments with the following:

./etch boston-training.etch -- 1st-file 2nd-file 3rd-file 4th-file