[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