fann.js icon indicating copy to clipboard operation
fann.js copied to clipboard

Missing FANN Merge Training Data Binding

Open geekgirljoy opened this issue 4 years ago • 0 comments

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>

geekgirljoy avatar Jul 17 '21 17:07 geekgirljoy