int main() { struct fann *ann; struct fann_train_data *train_data, *test_data; const float desired_error = (const float) 0.001; unsigned int max_neurons = 40; unsigned int neurons_between_reports = 1; printf("Reading data.\n"); train_data = fann_read_train_from_file("../benchmarks/datasets/two-spiral.train"); test_data = fann_read_train_from_file("../benchmarks/datasets/two-spiral.test"); fann_scale_train_data(train_data, 0, 1); fann_scale_train_data(test_data, 0, 1); printf("Creating network.\n"); ann = fann_create_shortcut(2, fann_num_input_train_data(train_data), fann_num_output_train_data(train_data)); fann_set_training_algorithm(ann, FANN_TRAIN_RPROP); fann_set_activation_function_hidden(ann, FANN_SIGMOID_SYMMETRIC); fann_set_activation_function_output(ann, FANN_LINEAR_PIECE); fann_set_train_error_function(ann, FANN_ERRORFUNC_LINEAR); fann_print_parameters(ann); printf("Training network.\n"); fann_cascadetrain_on_data(ann, train_data, max_neurons, neurons_between_reports, desired_error); fann_print_connections(ann); printf("\nTrain error: %f, Test error: %f\n\n", fann_test_data(ann, train_data), fann_test_data(ann, test_data)); printf("Saving network.\n"); fann_save(ann, "two_spirali.net"); printf("Cleaning up.\n"); fann_destroy_train(train_data); fann_destroy_train(test_data); fann_destroy(ann); return 0; }
/*! train:scale(min, max) *# Scales the inputs and outputs of training data to the new range [{{min}}-{{max}}] *x *- */ static int ann_train_scale(lua_State *L) { struct fann_train_data **train; fann_type min, max; train = luaL_checkudata(L, 1, FANN_TRAIN_METATABLE); luaL_argcheck(L, train != NULL, 1, "'training data' expected"); min = luaL_checknumber(L, 2); max = luaL_checknumber(L, 3); #ifdef FANN_VERBOSE printf("Scaling training data to %g - %g\n", (double)min, (double)max); #endif fann_scale_train_data(*train, min, max); return 0; }
int main() { struct fann *ann; struct fann_train_data *train_data, *test_data; const float desired_error = (const float)0.0; unsigned int max_neurons = 30; unsigned int neurons_between_reports = 1; unsigned int bit_fail_train, bit_fail_test; float mse_train, mse_test; unsigned int i = 0; fann_type *output; fann_type steepness; int multi = 0; enum fann_activationfunc_enum activation; enum fann_train_enum training_algorithm = FANN_TRAIN_RPROP; printf("Reading data.\n"); train_data = fann_read_train_from_file("../benchmarks/datasets/parity8.train"); test_data = fann_read_train_from_file("../benchmarks/datasets/parity8.test"); fann_scale_train_data(train_data, -1, 1); fann_scale_train_data(test_data, -1, 1); printf("Creating network.\n"); ann = fann_create_shortcut(2, fann_num_input_train_data(train_data), fann_num_output_train_data(train_data)); fann_set_training_algorithm(ann, training_algorithm); fann_set_activation_function_hidden(ann, FANN_SIGMOID_SYMMETRIC); fann_set_activation_function_output(ann, FANN_LINEAR); fann_set_train_error_function(ann, FANN_ERRORFUNC_LINEAR); if(!multi) { /*steepness = 0.5;*/ steepness = 1; fann_set_cascade_activation_steepnesses(ann, &steepness, 1); /*activation = FANN_SIN_SYMMETRIC;*/ activation = FANN_SIGMOID_SYMMETRIC; fann_set_cascade_activation_functions(ann, &activation, 1); fann_set_cascade_num_candidate_groups(ann, 8); } if(training_algorithm == FANN_TRAIN_QUICKPROP) { fann_set_learning_rate(ann, 0.35); fann_randomize_weights(ann, -2.0,2.0); } fann_set_bit_fail_limit(ann, 0.9); fann_set_train_stop_function(ann, FANN_STOPFUNC_BIT); fann_print_parameters(ann); fann_save(ann, "cascade_train2.net"); printf("Training network.\n"); fann_cascadetrain_on_data(ann, train_data, max_neurons, neurons_between_reports, desired_error); fann_print_connections(ann); mse_train = fann_test_data(ann, train_data); bit_fail_train = fann_get_bit_fail(ann); mse_test = fann_test_data(ann, test_data); bit_fail_test = fann_get_bit_fail(ann); printf("\nTrain error: %f, Train bit-fail: %d, Test error: %f, Test bit-fail: %d\n\n", mse_train, bit_fail_train, mse_test, bit_fail_test); for(i = 0; i < train_data->num_data; i++) { output = fann_run(ann, train_data->input[i]); if((train_data->output[i][0] >= 0 && output[0] <= 0) || (train_data->output[i][0] <= 0 && output[0] >= 0)) { printf("ERROR: %f does not match %f\n", train_data->output[i][0], output[0]); } } printf("Saving network.\n"); fann_save(ann, "cascade_train.net"); printf("Cleaning up.\n"); fann_destroy_train(train_data); fann_destroy_train(test_data); fann_destroy(ann); return 0; }
int main(int argc, char *argv[]) { struct fann_train_data *train, *test, *all; unsigned int i, j; unsigned int length, half_length; if(argc == 2) { train = fann_read_train_from_file(argv[1]); fann_shuffle_train_data(train); fann_scale_train_data(train, 0, 1); fann_save_train(train, argv[1]); return 0; } else if(argc == 3) { train = fann_read_train_from_file(argv[1]); test = fann_read_train_from_file(argv[2]); all = fann_merge_train_data(train, test); fann_shuffle_train_data(all); for(i = 0; i < train->num_data; i++) { for(j = 0; j < train->num_input; j++) { train->input[i][j] = all->input[i][j]; } for(j = 0; j < train->num_output; j++) { train->output[i][j] = all->output[i][j]; } } for(i = 0; i < test->num_data; i++) { for(j = 0; j < test->num_input; j++) { test->input[i][j] = all->input[i + train->num_data][j]; } for(j = 0; j < test->num_output; j++) { test->output[i][j] = all->output[i + train->num_data][j]; } } fann_save_train(train, argv[1]); fann_save_train(test, argv[2]); } else if(argc == 4) { all = fann_read_train_from_file(argv[1]); fann_shuffle_train_data(all); fann_scale_train_data(all, 0, 1); length = fann_length_train_data(all); half_length = length/2; train = fann_subset_train_data(all, 0, half_length); test = fann_subset_train_data(all, half_length, length-half_length); fann_save_train(train, argv[2]); fann_save_train(test, argv[3]); } else { printf("usage: %s train_file\n", argv[0]); printf("will shuffle the data in the file.\n"); printf("usage: %s train_file test_file\n", argv[0]); printf("will shuffle the data in the two files and save the new data back to them.\n"); printf("usage: %s input_file train_file test_file\n", argv[0]); printf("will shuffle the data in the input_file, and split it in two files and save the new data back to them.\n\n"); return -1; } return 0; }