#include #include #include #include #include "ann.h" int read_data(char* fname, double ***input, double ***output,int* num_records); int read_data(char* fname, double ***input, double ***output, int* num_records){ int class, count,i; double x1,x2; int nbytes = 99; char *trash = (char*)(malloc(100*sizeof(char))); FILE* fp = fopen(fname,"r"); count = 0; while(getline(&trash,&nbytes,fp) > 0) count++; (*input) = (double**)(malloc(count*sizeof(double*))); (*output) = (double**)(malloc(count*sizeof(double*))); for(i=0;i "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = -1; input[2] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); printf("AND\n"); p.weights[0][0] = 0.0; input[0] = 1; input[1] = -1; input[2] = -1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = -1; input[2] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); free_perceptron(&p); printf("XOR\n"); init_two_layer_NN(3,1,3,&tl); //XOR: tl.input_hidden_weights[0][0] = -100.0; tl.input_hidden_weights[1][0] = 200.0; tl.input_hidden_weights[2][0] = -200.0; tl.input_hidden_weights[0][1] = -100.0; tl.input_hidden_weights[1][1] = -200.0; tl.input_hidden_weights[2][1] = 200.0; tl.input_hidden_weights[0][2] = 100.0; tl.input_hidden_weights[1][2] = 0.0; tl.input_hidden_weights[2][2] = 0.0; tl.hidden_output_weights[0][0] = 200.0; tl.hidden_output_weights[1][0] = 200.0; tl.hidden_output_weights[2][0] = -100.0; input[0] = 1; input[1] = 0; input[2] = 0; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 0; input[2] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); free_two_layer_NN(&tl); } void test_update_ANN(double** training_inputs, double** training_outputs){ int i; double input[3], output[1]; struct perceptron p; struct two_layer_NN tl; printf("Testing perceptron update rule on the AND function\n"); init_perceptron(3,1,&p); for(i=0;i<100000;i++){ double bias,one,two,t; training_inputs[i][0] = bias = 1.0; training_inputs[i][1] = one = (drand48()*2)-1; training_inputs[i][2] = two = (drand48()*2)-1; training_outputs[i][0] = t = (threshold(one)>0 && threshold(two)>0)?1.0:-1.0; } train_perceptron(&p,training_inputs,training_outputs,0.1,100000); input[0] = 1; input[1] = -1; input[2] = -1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = -1; input[2] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_perceptron(&p,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); free_perceptron(&p); //Two layer! printf("Testing back-prop training on the XOR function\n"); init_two_layer_NN(3,1,3,&tl); for(i=0;i<100000;i++){ double bias,one,two,t; training_inputs[i][0] = bias = 1.0; training_inputs[i][1] = one = drand48(); training_inputs[i][2] = two = drand48(); training_outputs[i][0] = t = ((one>0.5 && two <0.5) || (two > 0.5 && one < 0.5))?1.0:0.0; } train_two_layer_NN(&tl,training_inputs,training_outputs,0.1,100000); input[0] = 1; input[1] = 0; input[2] = 0; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 0; input[2] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); input[1] = 1; run_two_layer_NN(&tl,input,output); print_arr(input,3); printf(" -> "); print_arr(output,1); printf("\n"); free_two_layer_NN(&tl); } int main(int argc, char** argv){ int i,j,k,l,num_hidden_nodes=10, train_rep=400; struct perceptron p; struct two_layer_NN tl; double output[1], nu=0.1; long int seed = (long int)time(NULL); /* double **training_inputs, **training_outputs; training_inputs = (double**)(malloc(100000*sizeof(double*))); training_outputs = (double**)(malloc(100000*sizeof(double*))); for(i=0;i<100000;i++){ training_inputs[i] = (double*)(malloc(3*sizeof(double))); training_outputs[i] = (double*)(malloc(1*sizeof(double))); } test_sigmoid_functions(); printf("***************************************************************************\n"); test_ANN_init_free(); printf("***************************************************************************\n"); test_running_ANN(); printf("***************************************************************************\n"); test_update_ANN(training_inputs,training_outputs); */ for(i=0;i 0 && outp[j][0] < 0)||(output[0]<0 && outp[j][0]>0)) bad_count++; } printf("Testing on %s: %d/%d\n",buf,num_rec-bad_count,num_rec); bad_sum += bad_count; big_sum += num_rec; free_perceptron(&p); for(l=0;l 0.5 && outp[i][0] < 0.5) || (output[0] < 0.5 && outp[i][0] > 0.5)) bad_count++; //printf("%f / %f\n",output[0],outp[i][0]); } printf("Testing on %s: %d/%d\n",buf,num_rec-bad_count,num_rec); bad_sum += bad_count; big_sum += num_rec; free_two_layer_NN(&tl); for(l=0;l