Chapter 3. Fixed Point Usage

It is possible to run the ANN with fixed point numbers (internally represented as integers). This option is only intended for use on computers with no floating point processor, for example, the iPAQ, but a minor performance enhancement can also be seen on most modern computers [IDS, 2000].

3.1. Training a Fixed Point ANN

The ANN cannot be trained in fixed point, which is why the training part is basically the same as for floating point numbers. The only difference is that you should save the ANN as fixed point. This is done by the fann_save_to_fixed function. This function saves a fixed point version of the ANN, but it also does some analysis, in order to find out where the decimal point should be. The result of this analysis is returned from the function.

The decimal point returned from the function is an indicator of, how many bits is used for the fractional part of the fixed point numbers. If this number is negative, there will most likely be integer overflow when running the library with fixed point numbers and this should be avoided. Furthermore, if the decimal point is too low (e.g. lower than 5), it is probably not a good idea to use the fixed point version.

Please note, that the inputs to networks that should be used in fixed point should be between -1 and 1.

Example 3-1. An example of a program written to support training in both fixed point and floating point numbers


#include "fann.h"
#include <stdio.h>

int main()
{
	fann_type *calc_out;
	const float connection_rate = 1;
	const float learning_rate = 0.7;
	const unsigned int num_input = 2;
	const unsigned int num_output = 1;
	const unsigned int num_layers = 3;
	const unsigned int num_neurons_hidden = 4;
	const float desired_error = 0.001;
	const unsigned int max_iterations = 20000;
	const unsigned int iterations_between_reports = 100;
	struct fann *ann;
	struct fann_train_data *data;
	
	unsigned int i = 0;
	unsigned int decimal_point;

	printf("Creating network.\n");

	ann = fann_create(connection_rate, learning_rate, num_layers,
		num_input,
		num_neurons_hidden,
		num_output);

	printf("Training network.\n");

	data = fann_read_train_from_file("xor.data");

	fann_train_on_data(ann, data, max_iterations, iterations_between_reports, desired_error);

	printf("Testing network.\n");

	for(i = 0; i < data->num_data; i++){
		calc_out = fann_run(ann, data->input[i]);
		printf("XOR test (%f,%f) -> %f, should be %f, difference=%f\n",
		data->input[i][0], data->input[i][1], *calc_out, data->output[i][0], fann_abs(*calc_out - data->output[i][0]));
	}
	
	printf("Saving network.\n");

	fann_save(ann, "xor_float.net");

	decimal_point = fann_save_to_fixed(ann, "xor_fixed.net");
	fann_save_train_to_fixed(data, "xor_fixed.data", decimal_point);
	
	printf("Cleaning up.\n");
	fann_destroy_train(data);
	fann_destroy(ann);
	
	return 0;
}

	

SourceForge.net Logo