fann.js
fann.js copied to clipboard
Missing FANN Merge Training Data Binding
The binding for fann_merge_train_data is not available.
In an ideal world that binding would exist but here is a workaround if/until it ever gets added to FANN.js:
<meta charset="utf-8"/>
<script async src="../fann.js"></script>
<script>
function MergeData(data1, data2, data_has_header){
// Split by new-lines
data1 = data1.split(/\n/);
data2 = data2.split(/\n/);
// Remove header if present
data1 = data1.slice(data_has_header ? 1 : 0);
data2 = data2.slice(data_has_header ? 1 : 0);
// Merge arrays
var data = data1.concat(data2);
// Create new FANN header
var input_count = data1[0].split(' ').length;
var output_count = data1[1].split(' ').length;
var header = ((data1.length / 2)+(data2.length / 2)) + " " + input_count + " " + output_count;
// Add the header to the beginning of the data
data.unshift(header);
// Convert the data back into a new-line delimited string and return
return data.join('\n', data);
}
function XOR () {
// New ANN
NN = FANN.create([2, 3, 1]);
////////////////////
// Configure ANN //
////////////////////
NN.set_activation_steepness_hidden(1);
NN.set_activation_steepness_output(1);
NN.set_activation_function_hidden(FANN.SIGMOID_SYMMETRIC);
NN.set_activation_function_output(FANN.SIGMOID_SYMMETRIC);
NN.set_train_stop_function(FANN.STOPFUNC_BIT);
NN.set_bit_fail_limit(0.01);
NN.set_training_algorithm(FANN.TRAIN_RPROP);
////////////////////
// Training Data //
////////////////////
var data_has_header = true;
var data1 = "2 2 1\n-1 -1\n-1\n-1 1\n1";
var data2 = "2 2 1\n1 -1\n1\n1 1\n-1";
// Merge data1 & data2
// NOTE: The inputs and outputs MUST be the same length in both datasets
var merged_xor = MergeData(data1, data2, data_has_header);
//console.log(merged_xor);
/*
Result:
"4 2 1
-1 -1
-1
-1 1
1
1 -1
1
1 1
-1"
*/
data = FANN.createTraining(merged_xor);
///////////
// Train //
///////////
NN.init_weights(data);
NN.train_on_data(data, 1000, 10, 0.01);
//////////
// Test //
//////////
var results = "";
results += " -1 , -1 => " + NN.run([-1, -1])[0] + '\n<br>';
results += "-1 , 1 => " + NN.run([-1, 1])[0] + '\n<br>';
results += " 1 , -1 => " + NN.run([1, -1])[0] + '\n<br>';
results += " 1 , 1 => " + NN.run([1, 1])[0] + '\n<br>';
////////////////////
// Output Results //
////////////////////
document.getElementById('results').innerHTML = results;
}
FANN_ready = function () {
XOR();
};
</script>
<div id='results'></div>