In the last post, we described how to implement Decision Trees on Embedded Systems. We ended the post by stating that while decision trees are well suited for data classification, its implementation on embedded systems is very challenging due to, more often than not, limited memory.
Time-delay neural networks (TDNN), another approach for data classification, gained momentum in the last years. It performs very well on time series and is therefore interesting for a wide range of applications, such as stock market prediction, image sequence analysis, and speech recognition. Further, it provides one significant advantage compared to decision trees: it can be more efficiently implemented on embedded systems. In the following, we will show how Matlab’s Neural Network Time Series Tool or its counterpart the timedelaynet function can be used to train time-delay neural networks and run them on embedded systems. The code discussed here can be found on GitHub.
Artificial neural networks approximate the operation of the human brain. Wikipedia has the following short and crisp introduction:
Neural networks are a computational approach which is based on a large collection of neural units loosely modeling the way a biological brain solves problems with large clusters of biological neurons connected by axons. Each neural unit is connected with many others, and links can be enforcing or inhibitory in their effect on the activation state of connected neural units. Each individual neural unit may have a summation function which combines the values of all its inputs together. There may be a threshold function or limiting function on each connection and on the unit itself such that it must surpass it before it can propagate to other neurons. These systems are self-learning and trained rather than explicitly programmed and excel in areas where the solution or feature detection is difficult to express in a traditional computer program.
Time-delay neural networks work on sequential data, e.g., time series, by augmenting the input with time-delayed copies of previous inputs:
We use Matlab’s pollution mortality data set to show how to create and deploy a time-delay neural network. The data set’s input consists of eight measurements of the ambient environment (temperature, relative humidity, carbon monoxide, sulfur dioxide, nitrogen dioxide, hydrocarbons, ozone, particulate) and three output variables (total mortality, respiratory mortality, cardiovascular mortality). We can either use the Neural Network GUI
or command line functions to construct a time-delay neural network with ten hidden nodes and a two step delay:
% Pollution data set: % - PollutionInputs: every input consists of 8 variables. % - PollutionTargets: every target consists of 3 variables. load pollution_dataset % Training function trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation. % Create a time-delay network. inputDelays = 1:2; hiddenLayerSize = 10; net = timedelaynet(inputDelays, hiddenLayerSize, trainFcn); % Prepare data for training. [x,xi,ai,t] = preparets(net, pollutionInputs, pollutionTargets); % Setup Division of data for training, validation, testing. net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Train the network. [net,tr] = train(net,x,t,xi,ai);
Next, we want to deploy the classifier on a real system and, hence, we need a C/C++ implementation of the created and trained neural network. We implement the export function extractNeuralNetwork, which takes as input the trained network net and automatically creates the class TDNNClassifier with the header files Data.h and TDNNClassifier.h and the source file TDNNClassifier.cpp:
% Create C++ implementation of the trained network. extractNeuralNetwork(net);
Now we can use the neural network in a C/C++ project to predict pollution-induced mortality rates:
#include <iostream> #include "Data.h" #include "TDNNClassifier.h" using namespace std; static const float POLLUTION_DATASET[5][8] = { {72.38, 29.20, 11.51, 3.37, 9.64, 45.79, 6.69, 72.72}, {67.19, 67.51, 8.92, 2.59, 10.05, 43.90, 6.83, 49.60}, {62.94, 61.42, 9.48, 3.29, 7.80, 32.18, 4.98, 55.68}, {72.49, 58.99, 10.28, 3.04, 13.39, 40.43, 9.25, 55.16}, {74.25, 34.80, 10.57, 3.39, 11.90, 48.53, 9.15, 66.02} }; int main(int argc, char* argv[]) { // Test the classifier with the first five inputs of Matlab's dataset // pollution_dataset, which was used to train the neural network. Data data; TDNNClassifier classifier; float *prediction; for (int d = 0; d < 5; d++) { for (int i = 0; i < 8; i++) { data.value[i] = POLLUTION_DATASET[d][i]; } prediction = classifier.Predict(data); cout << "Prediction " << prediction[0] << ", " << prediction[1] << ", " << prediction[2] << endl; } return 0; }
Check out the Github project TDNN-Matlab2Cpp for more details and the full source code.