[libfann] 19/242: changed some stuff for the activation functions (stepwise) and changed a bit in the benchmarks

Christian Kastner chrisk-guest at moszumanska.debian.org
Sat Oct 4 21:10:14 UTC 2014


This is an automated email from the git hooks/post-receive script.

chrisk-guest pushed a commit to tag Version2_0_0
in repository libfann.

commit 7904b408583ca4d63ec03407555db9824e293053
Author: Steffen Nissen <lukesky at diku.dk>
Date:   Tue Dec 9 09:24:41 2003 +0000

    changed some stuff for the activation functions (stepwise) and changed a bit in the benchmarks
---
 TODO                        |   1 +
 benchmarks/benchmark.sh     |  72 +++++++++++++--------------
 benchmarks/gnuplot          | 118 ++++++++++++++++++++++++++++++++++++++++++++
 benchmarks/performance.cc   |  30 +++++++++++
 benchmarks/quality.cc       |  20 +++++---
 examples/xor_train.c        |   3 ++
 src/fann.c                  |  73 +++++++++++++--------------
 src/fann_internal.c         |  86 ++++++++++++++++++++++++++++++++
 src/include/Makefile.am     |   2 +-
 src/include/Makefile.in     |   2 +-
 src/include/compat_time.h   |  96 +++++++++++++++++++++++++++++++++++
 src/include/fann.h          |   1 +
 src/include/fann_data.h     |  16 +++---
 src/include/fann_internal.h |  11 +++--
 14 files changed, 438 insertions(+), 93 deletions(-)

diff --git a/TODO b/TODO
new file mode 100644
index 0000000..e96525b
--- /dev/null
+++ b/TODO
@@ -0,0 +1 @@
+* More advanced activation functions
diff --git a/benchmarks/benchmark.sh b/benchmarks/benchmark.sh
index 2769a83..f6e853b 100755
--- a/benchmarks/benchmark.sh
+++ b/benchmarks/benchmark.sh
@@ -1,10 +1,9 @@
 #!/bin/sh
-test/performance fann fann_performance.out 1 2048 2 20
-test/performance fann_noopt fann_noopt_performance.out 1 2048 2 20
-test/performance fann_thres fann_thres_performance.out 1 2048 2 20
-test/performance_fixed fann fann_fixed_performance.out 1 2048 2 20
-test/performance lwnn lwnn_performance.out 1 2048 2 20
-test/performance jneural jneural_performance.out 1 512 2 20
+./performance fann fann_performance.out 1 2048 2 20
+./performance fann_stepwise fann_stepwise_performance.out 1 2048 2 20
+./performance_fixed fann fann_fixed_performance.out 1 2048 2 20
+./performance lwnn lwnn_performance.out 1 2048 2 20
+./performance jneural jneural_performance.out 1 512 2 20
 
 #./performance_arm fann fann_performance_arm.out 1 512 2 20
 #./performance_arm fann_noopt fann_noopt_performance_arm.out 1 512 2 20
@@ -14,44 +13,43 @@ test/performance jneural jneural_performance.out 1 512 2 20
 #./performance_arm jneural jneural_performance_arm.out 1 512 2 20
 
 rm -f *_fixed
-test/quality fann datasets/mydata/building.train datasets/mydata/building.test building_fann_train.out building_fann_test.out 16 0 200 1
-test/quality_fixed building_fann_train.out_fixed_train building_fann_train.out_fixed_test building_fann_fixed_train.out building_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/building.train datasets/mydata/building.test building_fann_half_train.out building_fann_half_test.out 16 0 200 1
-test/quality lwnn datasets/mydata/building.train datasets/mydata/building.test building_lwnn_train.out building_lwnn_test.out 16 0 200 1
-test/quality jneural datasets/mydata/building.train datasets/mydata/building.test building_jneural_train.out building_jneural_test.out 16 0 200 1
+./quality fann datasets/mydata/building.train datasets/mydata/building.test building_fann_train.out building_fann_test.out 16 0 200 1
+./quality_fixed building_fann_train.out_fixed_train building_fann_train.out_fixed_test building_fann_fixed_train.out building_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/building.train datasets/mydata/building.test building_fann_stepwise_train.out building_fann_stepwise_test.out 16 0 200 1
+./quality lwnn datasets/mydata/building.train datasets/mydata/building.test building_lwnn_train.out building_lwnn_test.out 16 0 200 1
+./quality jneural datasets/mydata/building.train datasets/mydata/building.test building_jneural_train.out building_jneural_test.out 16 0 200 1
 
 rm -f *_fixed
-test/quality fann datasets/mydata/card.train datasets/mydata/card.test card_fann_train.out card_fann_test.out 32 0 200 1
-test/quality_fixed card_fann_train.out_fixed_train card_fann_train.out_fixed_test card_fann_fixed_train.out card_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/card.train datasets/mydata/card.test card_fann_half_train.out card_fann_half_test.out 32 0 200 1
-test/quality lwnn datasets/mydata/card.train datasets/mydata/card.test card_lwnn_train.out card_lwnn_test.out 32 0 200 1
-test/quality jneural datasets/mydata/card.train datasets/mydata/card.test card_jneural_train.out card_jneural_test.out 32 0 200 1
+./quality fann datasets/mydata/card.train datasets/mydata/card.test card_fann_train.out card_fann_test.out 32 0 200 1
+./quality_fixed card_fann_train.out_fixed_train card_fann_train.out_fixed_test card_fann_fixed_train.out card_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/card.train datasets/mydata/card.test card_fann_stepwise_train.out card_fann_stepwise_test.out 32 0 200 1
+./quality lwnn datasets/mydata/card.train datasets/mydata/card.test card_lwnn_train.out card_lwnn_test.out 32 0 200 1
+./quality jneural datasets/mydata/card.train datasets/mydata/card.test card_jneural_train.out card_jneural_test.out 32 0 200 1
 
 rm -f *_fixed
-test/quality fann datasets/mydata/gene.train datasets/mydata/gene.test gene_fann_train.out gene_fann_test.out 4 2 200 1
-test/quality_fixed gene_fann_train.out_fixed_train gene_fann_train.out_fixed_test gene_fann_fixed_train.out gene_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/gene.train datasets/mydata/gene.test gene_fann_half_train.out gene_fann_half_test.out 4 2 200 1
-test/quality lwnn datasets/mydata/gene.train datasets/mydata/gene.test gene_lwnn_train.out gene_lwnn_test.out 4 2 200 1
-test/quality jneural datasets/mydata/gene.train datasets/mydata/gene.test gene_jneural_train.out gene_jneural_test.out 4 2 200 1
+./quality fann datasets/mydata/gene.train datasets/mydata/gene.test gene_fann_train.out gene_fann_test.out 4 2 200 1
+./quality_fixed gene_fann_train.out_fixed_train gene_fann_train.out_fixed_test gene_fann_fixed_train.out gene_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/gene.train datasets/mydata/gene.test gene_fann_stepwise_train.out gene_fann_stepwise_test.out 4 2 200 1
+./quality lwnn datasets/mydata/gene.train datasets/mydata/gene.test gene_lwnn_train.out gene_lwnn_test.out 4 2 200 1
+./quality jneural datasets/mydata/gene.train datasets/mydata/gene.test gene_jneural_train.out gene_jneural_test.out 4 2 200 1
 
 rm -f *_fixed
-test/quality fann datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_fann_train.out mushroom_fann_test.out 32 0 200 1
-test/quality_fixed mushroom_fann_train.out_fixed_train mushroom_fann_train.out_fixed_test mushroom_fann_fixed_train.out mushroom_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_fann_half_train.out mushroom_fann_half_test.out 32 0 200 1
-test/quality lwnn datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_lwnn_train.out mushroom_lwnn_test.out 32 0 200 1
-test/quality jneural datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_jneural_train.out mushroom_jneural_test.out 32 0 200 1
+./quality fann datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_fann_train.out mushroom_fann_test.out 32 0 200 1
+./quality_fixed mushroom_fann_train.out_fixed_train mushroom_fann_train.out_fixed_test mushroom_fann_fixed_train.out mushroom_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_fann_stepwise_train.out mushroom_fann_stepwise_test.out 32 0 200 1
+./quality lwnn datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_lwnn_train.out mushroom_lwnn_test.out 32 0 200 1
+./quality jneural datasets/mydata/mushroom.train datasets/mydata/mushroom.test mushroom_jneural_train.out mushroom_jneural_test.out 32 0 200 1
 
 rm -f *_fixed
-test/quality fann datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_fann_train.out soybean_fann_test.out 16 8 200 1
-test/quality_fixed soybean_fann_train.out_fixed_train soybean_fann_train.out_fixed_test soybean_fann_fixed_train.out soybean_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_fann_half_train.out soybean_fann_half_test.out 16 8 200 1
-test/quality lwnn datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_lwnn_train.out soybean_lwnn_test.out 16 8 200 1
-test/quality jneural datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_jneural_train.out soybean_jneural_test.out 16 8 200 1
+./quality fann datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_fann_train.out soybean_fann_test.out 16 8 200 1
+./quality_fixed soybean_fann_train.out_fixed_train soybean_fann_train.out_fixed_test soybean_fann_fixed_train.out soybean_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_fann_stepwise_train.out soybean_fann_stepwise_test.out 16 8 200 1
+./quality lwnn datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_lwnn_train.out soybean_lwnn_test.out 16 8 200 1
+./quality jneural datasets/mydata/soybean.train datasets/mydata/soybean.test soybean_jneural_train.out soybean_jneural_test.out 16 8 200 1
 
 rm -f *_fixed
-test/quality fann datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_fann_train.out thyroid_fann_test.out 16 8 200 1
-test/quality_fixed thyroid_fann_train.out_fixed_train thyroid_fann_train.out_fixed_test thyroid_fann_fixed_train.out thyroid_fann_fixed_test.out *_fixed
-test/quality fann_half datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_fann_half_train.out thyroid_fann_half_test.out 16 8 200 1
-test/quality lwnn datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_lwnn_train.out thyroid_lwnn_test.out 16 8 200 1
-test/quality jneural datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_jneural_train.out thyroid_jneural_test.out 16 8 200 1
-
+./quality fann datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_fann_train.out thyroid_fann_test.out 16 8 200 1
+./quality_fixed thyroid_fann_train.out_fixed_train thyroid_fann_train.out_fixed_test thyroid_fann_fixed_train.out thyroid_fann_fixed_test.out *_fixed
+./quality fann_stepwise datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_fann_stepwise_train.out thyroid_fann_stepwise_test.out 16 8 200 1
+./quality lwnn datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_lwnn_train.out thyroid_lwnn_test.out 16 8 200 1
+./quality jneural datasets/mydata/thyroid.train datasets/mydata/thyroid.test thyroid_jneural_train.out thyroid_jneural_test.out 16 8 200 1
diff --git a/benchmarks/gnuplot b/benchmarks/gnuplot
new file mode 100644
index 0000000..f04f26f
--- /dev/null
+++ b/benchmarks/gnuplot
@@ -0,0 +1,118 @@
+set terminal postscript color solid
+set output "allplots.ps"
+
+set nologscale
+set grid
+
+set xlabel "Seconds of training"
+set ylabel "Mean square error"
+
+set logscale x
+#set output "building.ps"
+set title "building"
+plot "building_fann_train.out" title "fann train" with lines -1, \
+ "building_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "building_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "building_lwnn_train.out" title "lwnn train" with lines 3, \
+ "building_jneural_train.out" title "jneural train" with lines 4, \
+ "building_fann_test.out" title "fann test" with lines -1, \
+ "building_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "building_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "building_lwnn_test.out" title "lwnn test" with lines 3, \
+ "building_jneural_test.out" title "jneural test" with lines 4
+
+set logscale x
+#set output "card.ps"
+set title "card"
+plot "card_fann_train.out" title "fann train" with lines -1, \
+ "card_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "card_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "card_lwnn_train.out" title "lwnn train" with lines 3, \
+ "card_jneural_train.out" title "jneural train" with lines 4, \
+ "card_fann_test.out" title "fann test" with lines -1, \
+ "card_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "card_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "card_lwnn_test.out" title "lwnn test" with lines 3, \
+ "card_jneural_test.out" title "jneural test" with lines 4
+
+#set output "gene.ps"
+set title "gene"
+plot "gene_fann_train.out" title "fann train" with lines -1, \
+ "gene_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "gene_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "gene_lwnn_train.out" title "lwnn train" with lines 3, \
+ "gene_jneural_train.out" title "jneural train" with lines 4, \
+ "gene_fann_test.out" title "fann test" with lines -1, \
+ "gene_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "gene_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "gene_lwnn_test.out" title "lwnn test" with lines 3, \
+ "gene_jneural_test.out" title "jneural test" with lines 4
+
+set logscale
+#set output "mushroom.ps"
+set title "mushroom"
+plot "mushroom_fann_train.out" title "fann train" with lines -1, \
+ "mushroom_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "mushroom_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "mushroom_lwnn_train.out" title "lwnn train" with lines 3, \
+ "mushroom_jneural_train.out" title "jneural train" with lines 4, \
+ "mushroom_fann_test.out" title "fann test" with lines -1, \
+ "mushroom_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "mushroom_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "mushroom_lwnn_test.out" title "lwnn test" with lines 3, \
+ "mushroom_jneural_test.out" title "jneural test" with lines 4
+set nologscale
+
+set logscale x
+#set output "soybean.ps"
+set title "soybean"
+plot "soybean_fann_train.out" title "fann train" with lines -1, \
+ "soybean_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "soybean_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "soybean_lwnn_train.out" title "lwnn train" with lines 3, \
+ "soybean_jneural_train.out" title "jneural train" with lines 4, \
+ "soybean_fann_test.out" title "fann test" with lines -1, \
+ "soybean_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "soybean_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "soybean_lwnn_test.out" title "lwnn test" with lines 3, \
+ "soybean_jneural_test.out" title "jneural test" with lines 4
+
+set nologscale
+#set output "thyroid.ps"
+set title "thyroid"
+plot "thyroid_fann_train.out" title "fann train" with lines -1, \
+ "thyroid_fann_stepwise_train.out" title "fann (stepwise) train" with lines 1, \
+ "thyroid_fann_fixed_train.out" title "fann (fix) train" with lines 2, \
+ "thyroid_lwnn_train.out" title "lwnn train" with lines 3, \
+ "thyroid_jneural_train.out" title "jneural train" with lines 4, \
+ "thyroid_fann_test.out" title "fann test" with lines -1, \
+ "thyroid_fann_stepwise_test.out" title "fann (stepwise) test" with lines 1, \
+ "thyroid_fann_fixed_test.out" title "fann (fix) test" with lines 2, \
+ "thyroid_lwnn_test.out" title "lwnn test" with lines 3, \
+ "thyroid_jneural_test.out" title "jneural test" with lines 4
+
+set xlabel "Number of neurons in the four layers"
+set ylabel "Nanoseconds per connection"
+
+set logscale
+#set output "performance.ps"
+set title "Performance"
+plot "fann_performance.out" title "fann" with lines -1, \
+ "fann_stepwise_performance.out" title "fann (stepwise)" with lines 1, \
+ "fann_fixed_performance.out" title "fann (fix)" with lines 2, \
+ "lwnn_performance.out" title "lwnn" with lines 3, \
+ "jneural_performance.out" title "jneural" with lines 4
+
+#set logscale
+#set output "performance_arm.ps"
+#set title "Performance iPAQ"
+#plot "fann_performance_arm.out" title "fann" with lines -1, \
+# "fann_thres_performance_arm.out" title "fann (thres)" with lines 1, \
+# "fann_fixed_performance_arm.out" title "fann (fix)" with lines 2, \
+# "fann_noopt_performance_arm.out" title "fann (noopt)" with lines 5, \
+# "lwnn_performance_arm.out" title "lwnn" with lines 3, \
+# "jneural_performance_arm.out" title "jneural" with lines 4
+
+set output
+set terminal x11
+
diff --git a/benchmarks/performance.cc b/benchmarks/performance.cc
index 869f4f5..2c3bbd9 100644
--- a/benchmarks/performance.cc
+++ b/benchmarks/performance.cc
@@ -160,6 +160,33 @@ void performance_benchmark_fann(FILE *out, fann_type *input,
 	fann_destroy(ann);	
 }
 
+void performance_benchmark_fann_stepwise(FILE *out, fann_type *input,
+	unsigned int num_neurons, unsigned int seconds_per_test)
+{
+	unsigned int i, total_connections;
+	fann_type *output;
+
+	struct fann *ann = fann_create(1, 0.7, 4,
+		num_neurons, num_neurons, num_neurons, num_neurons);
+
+	fann_set_activation_function_hidden(ann, FANN_SIGMOID_STEPWISE);
+	fann_set_activation_function_output(ann, FANN_SIGMOID_STEPWISE);
+	
+	total_connections = (num_neurons+1) * num_neurons * 3;
+		
+	start_timer();
+	
+	for(i = 0; time_elapsed() < (double)seconds_per_test; i++){
+		output = fann_run(ann, input);
+	}
+
+	stop_timer();
+
+	fprintf(out, "%d %.20e\n", num_neurons, getNanoPerN(i)/total_connections);
+	fprintf(stderr, "%d ", num_neurons);
+	fann_destroy(ann);	
+}
+
 int main(int argc, char* argv[])
 {
 	/* parameters */
@@ -212,6 +239,9 @@ int main(int argc, char* argv[])
 		}else if(strcmp(argv[1], "fann_noopt") == 0){
 			performance_benchmark_fann_noopt(out, input,
 				num_neurons, seconds_per_test);
+		}else if(strcmp(argv[1], "fann_stepwise") == 0){
+			performance_benchmark_fann_stepwise(out, input,
+				num_neurons, seconds_per_test);
 		}else if(strcmp(argv[1], "fann_thres") == 0){
 			performance_benchmark_fann_thres(out, input,
 				num_neurons, seconds_per_test);
diff --git a/benchmarks/quality.cc b/benchmarks/quality.cc
index 7eb5e89..48ae65e 100644
--- a/benchmarks/quality.cc
+++ b/benchmarks/quality.cc
@@ -116,7 +116,7 @@ void quality_benchmark_jneural(
 	delete ann;
 }
 
-void quality_benchmark_fann(float connection_rate,
+void quality_benchmark_fann(bool stepwise,
 	char *filename,
 	struct fann_train_data *train_data,
 	struct fann_train_data *test_data,
@@ -135,12 +135,20 @@ void quality_benchmark_fann(float connection_rate,
 	char fixed_point_file[256];
 	
 	if(num_neurons_hidden2){
-		ann = fann_create(connection_rate, 0.7, 4,
+		ann = fann_create(1, 0.7, 4,
 			num_input, num_neurons_hidden1, num_neurons_hidden2, num_output);
 	}else{
-		ann = fann_create(connection_rate, 0.7, 3,
+		ann = fann_create(1, 0.7, 3,
 			num_input, num_neurons_hidden1, num_output);
 	}
+
+	if(stepwise){
+		fann_set_activation_function_hidden(ann, FANN_SIGMOID_STEPWISE);
+		fann_set_activation_function_output(ann, FANN_SIGMOID_STEPWISE);
+	}else{
+		fann_set_activation_function_hidden(ann, FANN_SIGMOID);
+		fann_set_activation_function_output(ann, FANN_SIGMOID);
+	}
 	
 	calibrate_timer();
 
@@ -317,13 +325,13 @@ int main(int argc, char* argv[])
 			num_neurons_hidden2, train_data->num_output,
 			seconds_of_training, seconds_between_reports);
 	}else if(strcmp(argv[1], "fann") == 0){
-		quality_benchmark_fann(1, argv[4], train_data, test_data,
+		quality_benchmark_fann(false, argv[4], train_data, test_data,
 			train_out, test_out,
 			train_data->num_input, num_neurons_hidden1,
 			num_neurons_hidden2, train_data->num_output,
 			seconds_of_training, seconds_between_reports);
-	}else if(strcmp(argv[1], "fann_half") == 0){
-		quality_benchmark_fann(0.75, NULL, train_data, test_data,
+	}else if(strcmp(argv[1], "fann_stepwise") == 0){
+		quality_benchmark_fann(true, NULL, train_data, test_data,
 			train_out, test_out,
 			train_data->num_input, num_neurons_hidden1,
 			num_neurons_hidden2, train_data->num_output,
diff --git a/examples/xor_train.c b/examples/xor_train.c
index 9b9e164..7b48389 100644
--- a/examples/xor_train.c
+++ b/examples/xor_train.c
@@ -46,6 +46,9 @@ int main()
 		num_neurons_hidden,
 		num_output);
 
+	fann_set_activation_function_hidden(ann, FANN_SIGMOID_STEPWISE);
+	fann_set_activation_function_output(ann, FANN_SIGMOID_STEPWISE);
+
 	printf("Training network.\n");
 
 	data = fann_read_train_from_file("xor.data");
diff --git a/src/fann.c b/src/fann.c
index 8b97e33..71ec8dc 100644
--- a/src/fann.c
+++ b/src/fann.c
@@ -61,6 +61,7 @@ struct fann * fann_create(float connection_rate, float learning_rate,
 	decimal_point = ann->decimal_point;
 	multiplier = ann->multiplier;
 #endif
+	fann_initialise_result_array(ann);
 
 	/* determine how many neurons there should be in each layer */
 	va_start(layer_sizes, num_layers);
@@ -291,23 +292,12 @@ struct fann * fann_create_from_file(const char *configuration_file)
 
 	ann = fann_allocate_structure(learning_rate, num_layers);
 	ann->connection_rate = connection_rate;
-	
+
 #ifdef FIXEDFANN
 	ann->decimal_point = decimal_point;
 	ann->multiplier = multiplier;
-
-	/* Calculate the parameters for the stepwise linear
-	   sigmoid function fixed point.
-	   Using a rewritten sigmoid function.
-	   results 0.005, 0.05, 0.25, 0.75, 0.95, 0.995
-	 */
-	ann->activation_results[0] = (fann_type)(multiplier/200.0+0.5);
-	ann->activation_results[1] = (fann_type)(multiplier/20.0+0.5);
-	ann->activation_results[2] = (fann_type)(multiplier/4.0+0.5);
-	ann->activation_results[3] = multiplier - (fann_type)(multiplier/4.0+0.5);
-	ann->activation_results[4] = multiplier - (fann_type)(multiplier/20.0+0.5);
-	ann->activation_results[5] = multiplier - (fann_type)(multiplier/200.0+0.5);
 #endif
+	fann_initialise_result_array(ann);
 
 	fann_set_activation_hidden_steepness(ann, activation_hidden_steepness);
 	fann_set_activation_output_steepness(ann, activation_output_steepness);
@@ -408,37 +398,25 @@ void fann_set_learning_rate(struct fann *ann, float learning_rate)
 void fann_set_activation_function_hidden(struct fann *ann, unsigned int activation_function)
 {
 	ann->activation_function_hidden = activation_function;
+	fann_update_stepwise_hidden(ann);
 }
 
 void fann_set_activation_function_output(struct fann *ann, unsigned int activation_function)
 {
 	ann->activation_function_output = activation_function;
+	fann_update_stepwise_output(ann);
 }
 
 void fann_set_activation_hidden_steepness(struct fann *ann, fann_type steepness)
 {
-#ifdef FIXEDFANN
-	int i;
-#endif
 	ann->activation_hidden_steepness = steepness;
-#ifdef FIXEDFANN
-	for(i = 0; i < 6; i++){
-		ann->activation_hidden_values[i] = (fann_type)((((log(ann->multiplier/(float)ann->activation_results[i] -1)*(float)ann->multiplier) / -2.0)*(float)ann->multiplier) / steepness);
-	}
-#endif	
+	fann_update_stepwise_hidden(ann);
 }
 
 void fann_set_activation_output_steepness(struct fann *ann, fann_type steepness)
 {
-#ifdef FIXEDFANN
-	int i;
-#endif
 	ann->activation_output_steepness = steepness;
-#ifdef FIXEDFANN
-	for(i = 0; i < 6; i++){
-		ann->activation_output_values[i] = (fann_type)((((log(ann->multiplier/(float)ann->activation_results[i] -1)*(float)ann->multiplier) / -2.0)*(float)ann->multiplier) / steepness);
-	}
-#endif	
+	fann_update_stepwise_output(ann);
 }
 
 float fann_get_learning_rate(struct fann *ann)
@@ -836,9 +814,12 @@ fann_type* fann_run(struct fann *ann, fann_type *input)
 #ifdef FIXEDFANN
 	unsigned int multiplier = ann->multiplier;
 	unsigned int decimal_point = ann->decimal_point;
+#endif
 	
 	/* values used for the stepwise linear sigmoid function */
 
+	/* TODO do not extract these variabels when not needed */
+	
 	/* the results */
 	fann_type r1 = ann->activation_results[0];
 	fann_type r2 = ann->activation_results[1];
@@ -862,7 +843,6 @@ fann_type* fann_run(struct fann *ann, fann_type *input)
 	fann_type o4 = ann->activation_output_values[3];
 	fann_type o5 = ann->activation_output_values[4];
 	fann_type o6 = ann->activation_output_values[5];
-#endif
 
 	/* first set the input */
 	num_input = ann->num_input;
@@ -942,18 +922,33 @@ fann_type* fann_run(struct fann *ann, fann_type *input)
 				}
 			}
 
-			if(activation_function == FANN_SIGMOID){
+			switch(activation_function){
 #ifdef FIXEDFANN
-				if(layer_it == last_layer-1){
-					neuron_it->value = fann_sigmoid_stepwise(o1, o2, o3, o4, o5, o6, r1, r2, r3, r4, r5, r6, neuron_value, multiplier);
-				}else{
-					neuron_it->value = fann_sigmoid_stepwise(h1, h2, h3, h4, h5, h6, r1, r2, r3, r4, r5, r6, neuron_value, multiplier);
-				}
+				case FANN_SIGMOID:
+				case FANN_SIGMOID_STEPWISE:
+					if(layer_it == last_layer-1){
+						neuron_it->value = fann_sigmoid_stepwise(o1, o2, o3, o4, o5, o6, r1, r2, r3, r4, r5, r6, neuron_value, multiplier);
+					}else{
+						neuron_it->value = fann_sigmoid_stepwise(h1, h2, h3, h4, h5, h6, r1, r2, r3, r4, r5, r6, neuron_value, multiplier);
+					}
+					break;
 #else
-				neuron_it->value = fann_sigmoid(steepness, neuron_value);
+				case FANN_SIGMOID:
+					neuron_it->value = fann_sigmoid(steepness, neuron_value);
+					break;
+					
+				case FANN_SIGMOID_STEPWISE:
+					if(layer_it == last_layer-1){
+						neuron_it->value = fann_sigmoid_stepwise(o1, o2, o3, o4, o5, o6, r1, r2, r3, r4, r5, r6, neuron_value, 1);
+					}else{
+						neuron_it->value = fann_sigmoid_stepwise(h1, h2, h3, h4, h5, h6, r1, r2, r3, r4, r5, r6, neuron_value, 1);
+					}
+					break;
 #endif
-			}else{
-				neuron_it->value = (neuron_value < 0) ? 0 : 1;
+
+				case FANN_THRESHOLD:
+					neuron_it->value = (neuron_value < 0) ? 0 : 1;
+					break;
 			}
 		}
 	}	
diff --git a/src/fann_internal.c b/src/fann_internal.c
index dd9e4c8..d87bd34 100644
--- a/src/fann_internal.c
+++ b/src/fann_internal.c
@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #include <sys/time.h>
 #include <time.h>
 
+#include "compat_time.h"
 #include "fann.h"
 #include "fann_internal.h"
 
@@ -334,6 +335,91 @@ void fann_save_train_internal(struct fann_train_data* data, char *filename, unsi
 	fclose(file);
 }
 
+void fann_initialise_result_array(struct fann *ann)
+{
+#ifdef FIXEDFANN
+	/* Calculate the parameters for the stepwise linear
+	   sigmoid function fixed point.
+	   Using a rewritten sigmoid function.
+	   results 0.005, 0.05, 0.25, 0.75, 0.95, 0.995
+	*/
+	ann->activation_results[0] = (fann_type)(ann->multiplier/200.0+0.5);
+	ann->activation_results[1] = (fann_type)(ann->multiplier/20.0+0.5);
+	ann->activation_results[2] = (fann_type)(ann->multiplier/4.0+0.5);
+	ann->activation_results[3] = ann->multiplier - (fann_type)(ann->multiplier/4.0+0.5);
+	ann->activation_results[4] = ann->multiplier - (fann_type)(ann->multiplier/20.0+0.5);
+	ann->activation_results[5] = ann->multiplier - (fann_type)(ann->multiplier/200.0+0.5);
+#else
+	/* For use in stepwise linear activation function.
+	   results 0.005, 0.05, 0.25, 0.75, 0.95, 0.995
+	*/
+	ann->activation_results[0] = 0.005;
+	ann->activation_results[1] = 0.05;
+	ann->activation_results[2] = 0.25;
+	ann->activation_results[3] = 0.75;
+	ann->activation_results[4] = 0.95;
+	ann->activation_results[5] = 0.995;	
+#endif
+}
+
+/* Adjust the steepwise functions (if used) */
+void fann_update_stepwise_hidden(struct fann *ann)
+{
+	unsigned int i = 0;
+	for(i = 0; i < 6; i++){
+#ifdef FIXEDFANN
+		switch(ann->activation_function_hidden){
+			case FANN_SIGMOID:
+			case FANN_SIGMOID_STEPWISE:
+				ann->activation_hidden_values[i] = (fann_type)((((log(ann->multiplier/(float)ann->activation_results[i] -1)*(float)ann->multiplier) / -2.0)*(float)ann->multiplier) / ann->activation_hidden_steepness);
+				break;
+			case FANN_THRESHOLD:
+				break;
+		}
+#else
+		switch(ann->activation_function_hidden){
+			case FANN_SIGMOID:
+				break;
+			case FANN_SIGMOID_STEPWISE:
+				ann->activation_hidden_values[i] = ((log(1.0/ann->activation_results[i] -1.0) * 1.0/-2.0) * 1.0/ann->activation_hidden_steepness);
+				break;
+			case FANN_THRESHOLD:
+				break;
+		}
+#endif
+	}
+}
+
+/* Adjust the steepwise functions (if used) */
+void fann_update_stepwise_output(struct fann *ann)
+{
+	unsigned int i = 0;
+	for(i = 0; i < 6; i++){
+#ifdef FIXEDFANN
+		switch(ann->activation_function_output){
+			case FANN_SIGMOID:
+			case FANN_SIGMOID_STEPWISE:
+				ann->activation_output_values[i] = (fann_type)((((log(ann->multiplier/(float)ann->activation_results[i] -1)*(float)ann->multiplier) / -2.0)*(float)ann->multiplier) / ann->activation_output_steepness);
+				break;
+			case FANN_THRESHOLD:
+				break;
+		}
+#else
+		switch(ann->activation_function_output){
+			case FANN_SIGMOID:
+				break;
+			case FANN_SIGMOID_STEPWISE:
+				ann->activation_output_values[i] = ((log(1.0/ann->activation_results[i] -1.0) * 1.0/-2.0) * 1.0/ann->activation_output_steepness);
+				//printf("%f -> %f\n", ann->activation_results[i], ann->activation_output_values[i]);
+				break;
+			case FANN_THRESHOLD:
+				break;
+		}
+#endif
+	}
+}
+
+
 /* Seed the random function.
  */
 void fann_seed_rand()
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index fc32a5a..d76c625 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -1 +1 @@
-include_HEADERS = fann.h doublefann.h fann_internal.h floatfann.h doublefann.h fann_data.h fixedfann.h
+include_HEADERS = fann.h doublefann.h fann_internal.h floatfann.h doublefann.h fann_data.h fixedfann.h compat_time.h
diff --git a/src/include/Makefile.in b/src/include/Makefile.in
index 5812db8..cf6955c 100644
--- a/src/include/Makefile.in
+++ b/src/include/Makefile.in
@@ -85,7 +85,7 @@ RC = @RC@
 STRIP = @STRIP@
 VERSION = @VERSION@
 
-include_HEADERS = fann.h doublefann.h fann_internal.h floatfann.h doublefann.h fann_data.h fixedfann.h
+include_HEADERS = fann.h doublefann.h fann_internal.h floatfann.h doublefann.h fann_data.h fixedfann.h compat_time.h
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = 
diff --git a/src/include/compat_time.h b/src/include/compat_time.h
new file mode 100644
index 0000000..4523ef9
--- /dev/null
+++ b/src/include/compat_time.h
@@ -0,0 +1,96 @@
+/*
+
+Originally timeval.h by Wu Yongwei
+
+Fast Artificial Neural Network Library (fann)
+Copyright (C) 2003 Steffen Nissen (lukesky at diku.dk)
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/*
+ * timeval.h    1.0 01/12/19
+ *
+ * Defines gettimeofday, timeval, etc. for Win32
+ *
+ * By Wu Yongwei
+ *
+ */
+
+#ifndef _TIMEVAL_H
+#define _TIMEVAL_H
+
+#ifdef _WIN32
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <time.h>
+
+#ifndef __GNUC__
+#define EPOCHFILETIME (116444736000000000i64)
+#else
+#define EPOCHFILETIME (116444736000000000LL)
+#endif
+
+struct timeval {
+    long tv_sec;        /* seconds */
+    long tv_usec;  /* microseconds */
+};
+
+struct timezone {
+    int tz_minuteswest; /* minutes W of Greenwich */
+    int tz_dsttime;     /* type of dst correction */
+};
+
+__inline int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+    FILETIME        ft;
+    LARGE_INTEGER   li;
+    __int64         t;
+    static int      tzflag;
+
+    if (tv)
+    {
+        GetSystemTimeAsFileTime(&ft);
+        li.LowPart  = ft.dwLowDateTime;
+        li.HighPart = ft.dwHighDateTime;
+        t  = li.QuadPart;       /* In 100-nanosecond intervals */
+        t -= EPOCHFILETIME;     /* Offset to the Epoch time */
+        t /= 10;                /* In microseconds */
+        tv->tv_sec  = (long)(t / 1000000);
+        tv->tv_usec = (long)(t % 1000000);
+    }
+
+    if (tz)
+    {
+        if (!tzflag)
+        {
+            _tzset();
+            tzflag++;
+        }
+        tz->tz_minuteswest = _timezone / 60;
+        tz->tz_dsttime = _daylight;
+    }
+
+    return 0;
+}
+
+#else  /* _WIN32 */
+
+#include <sys/time.h>
+
+#endif /* _WIN32 */
+
+#endif /* _TIMEVAL_H */
diff --git a/src/include/fann.h b/src/include/fann.h
index efd2d01..63b1c5e 100644
--- a/src/include/fann.h
+++ b/src/include/fann.h
@@ -116,6 +116,7 @@ void fann_set_learning_rate(struct fann *ann, float learning_rate);
  */
 #define FANN_SIGMOID 1
 #define FANN_THRESHOLD 2
+#define FANN_SIGMOID_STEPWISE 3
 
 /* Set the activation function for the hidden layers (default SIGMOID).
  */
diff --git a/src/include/fann_data.h b/src/include/fann_data.h
index fbf96c1..2fd3e8c 100644
--- a/src/include/fann_data.h
+++ b/src/include/fann_data.h
@@ -30,7 +30,11 @@ struct fann_neuron
 	struct fann_neuron **connected_neurons;
 	unsigned int num_connections;
 	fann_type value;
+#ifdef __GNUC__
 }__attribute__((packed));
+#else
+}
+#endif
 
 /* A single layer in the neural network.
  */
@@ -90,7 +94,7 @@ struct fann
 	/* Used to choose which activation function to use
 	   
 	   Sometimes it can be smart, to set the activation function for the hidden neurons
-	   to THRESHOLD and the activation function for the output neurons to SIGMOID,
+	   to FANN_THRESHOLD and the activation function for the output neurons to FANN_SIGMOID,
 	   in this way you get a very fast network, that is still cabable of
 	   producing real valued output.
 	 */
@@ -111,17 +115,17 @@ struct fann
 	   Only used in special cases, since the decimal_point is much faster.
 	*/
 	unsigned int multiplier;
+#endif
 
-	/* When in fixed point, the sigmoid function is calculated as a stepwise linear
-	   function. In the activation_results array, the result is saved, and in the two values arrays,
-	   the values that gives the results are saved.
+	/* When in choosen (or in fixed point), the sigmoid function is
+	   calculated as a stepwise linear function. In the
+	   activation_results array, the result is saved, and in the
+	   two values arrays, the values that gives the results are saved.
 	 */
 	fann_type activation_results[6];
 	fann_type activation_hidden_values[6];
 	fann_type activation_output_values[6];
 
-#endif
-
 	/* Total number of connections.
 	 * very usefull, because the actual connections
 	 * are allocated in one long array
diff --git a/src/include/fann_internal.h b/src/include/fann_internal.h
index 9bdd5bf..76cefe8 100644
--- a/src/include/fann_internal.h
+++ b/src/include/fann_internal.h
@@ -45,6 +45,10 @@ void fann_save_train_internal(struct fann_train_data* data, char *filename, unsi
 int fann_compare_connections(const void* c1, const void* c2);
 void fann_seed_rand();
 
+void fann_initialise_result_array(struct fann *ann);
+void fann_update_stepwise_hidden(struct fann *ann);
+void fann_update_stepwise_output(struct fann *ann);
+
 /* called fann_max, in order to not interferre with predefined versions of max */
 #define fann_max(x, y) (((x) > (y)) ? (x) : (y))
 #define fann_min(x, y) (((x) < (y)) ? (x) : (y))
@@ -53,6 +57,10 @@ void fann_seed_rand();
 
 #define fann_abs(value) (((value) > 0) ? (value) : -(value))
 
+/* sigmoid as a stepwise linear function */
+#define fann_linear(v1, r1, v2, r2, value) ((((r2-r1) * (value-v1))/(v2-v1)) + r1)
+#define fann_sigmoid_stepwise(v1, v2, v3, v4, v5, v6, r1, r2, r3, r4, r5, r6, value, multiplier) (value < v5 ? (value < v3 ? (value < v2 ? (value < v1 ? 0 : fann_linear(v1, r1, v2, r2, value)) : fann_linear(v2, r2, v3, r3, value)) : (value < v4 ? fann_linear(v3, r3, v4, r4, value) : fann_linear(v4, r4, v5, r5, value))) : (value < v6 ? fann_linear(v5, r5, v6, r6, value) : multiplier))
+
 #ifdef FIXEDFANN
 
 #define fann_mult(x,y) ((x*y) >> decimal_point)
@@ -60,9 +68,6 @@ void fann_seed_rand();
 #define fann_random_weight() (fann_type)(fann_rand(-multiplier/10,multiplier/10))
 /* sigmoid calculated with use of floats, only as reference */
 #define fann_sigmoid(steepness, value) ((fann_type)(0.5+((1.0/(1.0 + exp(-2.0 * ((float)steepness/multiplier) * ((float)value/multiplier))))*multiplier)))
-/* sigmoid as a stepwise linear function */
-#define fann_linear(v1, r1, v2, r2, value) ((((r2-r1) * (value-v1))/(v2-v1)) + r1)
-#define fann_sigmoid_stepwise(v1, v2, v3, v4, v5, v6, r1, r2, r3, r4, r5, r6, value, multiplier) (value < v5 ? (value < v3 ? (value < v2 ? (value < v1 ? 0 : fann_linear(v1, r1, v2, r2, value)) : fann_linear(v2, r2, v3, r3, value)) : (value < v4 ? fann_linear(v3, r3, v4, r4, value) : fann_linear(v4, r4, v5, r5, value))) : (value < v6 ? fann_linear(v5, r5, v6, r6, value) : multiplier))
 #else
 
 #define fann_mult(x,y) (x*y)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/libfann.git



More information about the debian-science-commits mailing list