|
|
@ -14,6 +14,9 @@ |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdlib.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define _GNU_SOURCE |
|
|
|
|
|
|
|
#include <fenv.h> |
|
|
|
|
|
|
|
|
|
|
|
void test_convolve() |
|
|
|
void test_convolve() |
|
|
|
{ |
|
|
|
{ |
|
|
|
image dog = load_image("dog.jpg"); |
|
|
|
image dog = load_image("dog.jpg"); |
|
|
@ -26,7 +29,7 @@ void test_convolve() |
|
|
|
convolve(dog, kernel, 1, 0, edge, 1); |
|
|
|
convolve(dog, kernel, 1, 0, edge, 1); |
|
|
|
} |
|
|
|
} |
|
|
|
end = clock(); |
|
|
|
end = clock(); |
|
|
|
printf("Convolutions: %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC); |
|
|
|
printf("Convolutions: %lf seconds\n", (float)(end-start)/CLOCKS_PER_SEC); |
|
|
|
show_image_layers(edge, "Test Convolve"); |
|
|
|
show_image_layers(edge, "Test Convolve"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -38,11 +41,11 @@ void test_convolve_matrix() |
|
|
|
int size = 11; |
|
|
|
int size = 11; |
|
|
|
int stride = 4; |
|
|
|
int stride = 4; |
|
|
|
int n = 40; |
|
|
|
int n = 40; |
|
|
|
double *filters = make_random_image(size, size, dog.c*n).data; |
|
|
|
float *filters = make_random_image(size, size, dog.c*n).data; |
|
|
|
|
|
|
|
|
|
|
|
int mw = ((dog.h-size)/stride+1)*((dog.w-size)/stride+1); |
|
|
|
int mw = ((dog.h-size)/stride+1)*((dog.w-size)/stride+1); |
|
|
|
int mh = (size*size*dog.c); |
|
|
|
int mh = (size*size*dog.c); |
|
|
|
double *matrix = calloc(mh*mw, sizeof(double)); |
|
|
|
float *matrix = calloc(mh*mw, sizeof(float)); |
|
|
|
|
|
|
|
|
|
|
|
image edge = make_image((dog.h-size)/stride+1, (dog.w-size)/stride+1, n); |
|
|
|
image edge = make_image((dog.h-size)/stride+1, (dog.w-size)/stride+1, n); |
|
|
|
|
|
|
|
|
|
|
@ -54,7 +57,7 @@ void test_convolve_matrix() |
|
|
|
gemm(0,0,n,mw,mh,1,filters,mh,matrix,mw,1,edge.data,mw); |
|
|
|
gemm(0,0,n,mw,mh,1,filters,mh,matrix,mw,1,edge.data,mw); |
|
|
|
} |
|
|
|
} |
|
|
|
end = clock(); |
|
|
|
end = clock(); |
|
|
|
printf("Convolutions: %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC); |
|
|
|
printf("Convolutions: %lf seconds\n", (float)(end-start)/CLOCKS_PER_SEC); |
|
|
|
show_image_layers(edge, "Test Convolve"); |
|
|
|
show_image_layers(edge, "Test Convolve"); |
|
|
|
cvWaitKey(0); |
|
|
|
cvWaitKey(0); |
|
|
|
} |
|
|
|
} |
|
|
@ -72,11 +75,11 @@ void verify_convolutional_layer() |
|
|
|
int n = 1; |
|
|
|
int n = 1; |
|
|
|
int stride = 1; |
|
|
|
int stride = 1; |
|
|
|
int size = 3; |
|
|
|
int size = 3; |
|
|
|
double eps = .00000001; |
|
|
|
float eps = .00000001; |
|
|
|
image test = make_random_image(5,5, 1); |
|
|
|
image test = make_random_image(5,5, 1); |
|
|
|
convolutional_layer layer = *make_convolutional_layer(test.h,test.w,test.c, n, size, stride, RELU); |
|
|
|
convolutional_layer layer = *make_convolutional_layer(test.h,test.w,test.c, n, size, stride, RELU); |
|
|
|
image out = get_convolutional_image(layer); |
|
|
|
image out = get_convolutional_image(layer); |
|
|
|
double **jacobian = calloc(test.h*test.w*test.c, sizeof(double)); |
|
|
|
float **jacobian = calloc(test.h*test.w*test.c, sizeof(float)); |
|
|
|
|
|
|
|
|
|
|
|
forward_convolutional_layer(layer, test.data); |
|
|
|
forward_convolutional_layer(layer, test.data); |
|
|
|
image base = copy_image(out); |
|
|
|
image base = copy_image(out); |
|
|
@ -90,19 +93,19 @@ void verify_convolutional_layer() |
|
|
|
jacobian[i] = partial.data; |
|
|
|
jacobian[i] = partial.data; |
|
|
|
test.data[i] -= eps; |
|
|
|
test.data[i] -= eps; |
|
|
|
} |
|
|
|
} |
|
|
|
double **jacobian2 = calloc(out.h*out.w*out.c, sizeof(double)); |
|
|
|
float **jacobian2 = calloc(out.h*out.w*out.c, sizeof(float)); |
|
|
|
image in_delta = make_image(test.h, test.w, test.c); |
|
|
|
image in_delta = make_image(test.h, test.w, test.c); |
|
|
|
image out_delta = get_convolutional_delta(layer); |
|
|
|
image out_delta = get_convolutional_delta(layer); |
|
|
|
for(i = 0; i < out.h*out.w*out.c; ++i){ |
|
|
|
for(i = 0; i < out.h*out.w*out.c; ++i){ |
|
|
|
out_delta.data[i] = 1; |
|
|
|
out_delta.data[i] = 1; |
|
|
|
//backward_convolutional_layer(layer, test.data, in_delta.data);
|
|
|
|
backward_convolutional_layer(layer, in_delta.data); |
|
|
|
image partial = copy_image(in_delta); |
|
|
|
image partial = copy_image(in_delta); |
|
|
|
jacobian2[i] = partial.data; |
|
|
|
jacobian2[i] = partial.data; |
|
|
|
out_delta.data[i] = 0; |
|
|
|
out_delta.data[i] = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
int j; |
|
|
|
int j; |
|
|
|
double *j1 = calloc(test.h*test.w*test.c*out.h*out.w*out.c, sizeof(double)); |
|
|
|
float *j1 = calloc(test.h*test.w*test.c*out.h*out.w*out.c, sizeof(float)); |
|
|
|
double *j2 = calloc(test.h*test.w*test.c*out.h*out.w*out.c, sizeof(double)); |
|
|
|
float *j2 = calloc(test.h*test.w*test.c*out.h*out.w*out.c, sizeof(float)); |
|
|
|
for(i = 0; i < test.h*test.w*test.c; ++i){ |
|
|
|
for(i = 0; i < test.h*test.w*test.c; ++i){ |
|
|
|
for(j =0 ; j < out.h*out.w*out.c; ++j){ |
|
|
|
for(j =0 ; j < out.h*out.w*out.c; ++j){ |
|
|
|
j1[i*out.h*out.w*out.c + j] = jacobian[i][j]; |
|
|
|
j1[i*out.h*out.w*out.c + j] = jacobian[i][j]; |
|
|
@ -112,12 +115,11 @@ void verify_convolutional_layer() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
image mj1 = double_to_image(test.w*test.h*test.c, out.w*out.h*out.c, 1, j1); |
|
|
|
image mj1 = float_to_image(test.w*test.h*test.c, out.w*out.h*out.c, 1, j1); |
|
|
|
image mj2 = double_to_image(test.w*test.h*test.c, out.w*out.h*out.c, 1, j2); |
|
|
|
image mj2 = float_to_image(test.w*test.h*test.c, out.w*out.h*out.c, 1, j2); |
|
|
|
printf("%f %f\n", avg_image_layer(mj1,0), avg_image_layer(mj2,0)); |
|
|
|
printf("%f %f\n", avg_image_layer(mj1,0), avg_image_layer(mj2,0)); |
|
|
|
show_image(mj1, "forward jacobian"); |
|
|
|
show_image(mj1, "forward jacobian"); |
|
|
|
show_image(mj2, "backward jacobian"); |
|
|
|
show_image(mj2, "backward jacobian"); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_load() |
|
|
|
void test_load() |
|
|
@ -145,7 +147,7 @@ void test_rotate() |
|
|
|
rotate_image(dog); |
|
|
|
rotate_image(dog); |
|
|
|
} |
|
|
|
} |
|
|
|
end = clock(); |
|
|
|
end = clock(); |
|
|
|
printf("Rotations: %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC); |
|
|
|
printf("Rotations: %lf seconds\n", (float)(end-start)/CLOCKS_PER_SEC); |
|
|
|
show_image(dog, "Test Rotate"); |
|
|
|
show_image(dog, "Test Rotate"); |
|
|
|
|
|
|
|
|
|
|
|
image random = make_random_image(3,3,3); |
|
|
|
image random = make_random_image(3,3,3); |
|
|
@ -159,18 +161,18 @@ void test_rotate() |
|
|
|
void test_parser() |
|
|
|
void test_parser() |
|
|
|
{ |
|
|
|
{ |
|
|
|
network net = parse_network_cfg("test_parser.cfg"); |
|
|
|
network net = parse_network_cfg("test_parser.cfg"); |
|
|
|
double input[1]; |
|
|
|
float input[1]; |
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
|
|
|
|
|
|
|
|
double avgerr = 0; |
|
|
|
float avgerr = 0; |
|
|
|
while(++count < 100000000){ |
|
|
|
while(++count < 100000000){ |
|
|
|
double v = ((double)rand()/RAND_MAX); |
|
|
|
float v = ((float)rand()/RAND_MAX); |
|
|
|
double truth = v*v; |
|
|
|
float truth = v*v; |
|
|
|
input[0] = v; |
|
|
|
input[0] = v; |
|
|
|
forward_network(net, input); |
|
|
|
forward_network(net, input); |
|
|
|
double *out = get_network_output(net); |
|
|
|
float *out = get_network_output(net); |
|
|
|
double *delta = get_network_delta(net); |
|
|
|
float *delta = get_network_delta(net); |
|
|
|
double err = pow((out[0]-truth),2.); |
|
|
|
float err = pow((out[0]-truth),2.); |
|
|
|
avgerr = .99 * avgerr + .01 * err; |
|
|
|
avgerr = .99 * avgerr + .01 * err; |
|
|
|
if(count % 1000000 == 0) printf("%f %f :%f AVG %f \n", truth, out[0], err, avgerr); |
|
|
|
if(count % 1000000 == 0) printf("%f %f :%f AVG %f \n", truth, out[0], err, avgerr); |
|
|
|
delta[0] = truth - out[0]; |
|
|
|
delta[0] = truth - out[0]; |
|
|
@ -192,9 +194,9 @@ void test_full() |
|
|
|
srand(0); |
|
|
|
srand(0); |
|
|
|
int i = 0; |
|
|
|
int i = 0; |
|
|
|
char *labels[] = {"cat","dog"}; |
|
|
|
char *labels[] = {"cat","dog"}; |
|
|
|
double lr = .00001; |
|
|
|
float lr = .00001; |
|
|
|
double momentum = .9; |
|
|
|
float momentum = .9; |
|
|
|
double decay = 0.01; |
|
|
|
float decay = 0.01; |
|
|
|
while(i++ < 1000 || 1){ |
|
|
|
while(i++ < 1000 || 1){ |
|
|
|
data train = load_data_image_pathfile_random("train_paths.txt", 1000, labels, 2); |
|
|
|
data train = load_data_image_pathfile_random("train_paths.txt", 1000, labels, 2); |
|
|
|
train_network(net, train, lr, momentum, decay); |
|
|
|
train_network(net, train, lr, momentum, decay); |
|
|
@ -207,32 +209,33 @@ void test_nist() |
|
|
|
{ |
|
|
|
{ |
|
|
|
srand(444444); |
|
|
|
srand(444444); |
|
|
|
srand(888888); |
|
|
|
srand(888888); |
|
|
|
network net = parse_network_cfg("nist_basic.cfg"); |
|
|
|
network net = parse_network_cfg("nist.cfg"); |
|
|
|
data train = load_categorical_data_csv("mnist/mnist_train.csv", 0, 10); |
|
|
|
data train = load_categorical_data_csv("mnist/mnist_train.csv", 0, 10); |
|
|
|
data test = load_categorical_data_csv("mnist/mnist_test.csv",0,10); |
|
|
|
data test = load_categorical_data_csv("mnist/mnist_test.csv",0,10); |
|
|
|
normalize_data_rows(train); |
|
|
|
normalize_data_rows(train); |
|
|
|
normalize_data_rows(test); |
|
|
|
normalize_data_rows(test); |
|
|
|
//randomize_data(train);
|
|
|
|
//randomize_data(train);
|
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
double lr = .0005; |
|
|
|
float lr = .0005; |
|
|
|
double momentum = .9; |
|
|
|
float momentum = .9; |
|
|
|
double decay = 0.01; |
|
|
|
float decay = 0.01; |
|
|
|
clock_t start = clock(), end; |
|
|
|
clock_t start = clock(), end; |
|
|
|
while(++count <= 100){ |
|
|
|
while(++count <= 100){ |
|
|
|
visualize_network(net); |
|
|
|
//visualize_network(net);
|
|
|
|
double loss = train_network_sgd(net, train, 10000, lr, momentum, decay); |
|
|
|
float loss = train_network_sgd(net, train, 1000, lr, momentum, decay); |
|
|
|
printf("%5d Training Loss: %lf, Params: %f %f %f, ",count*100, loss, lr, momentum, decay); |
|
|
|
printf("%5d Training Loss: %lf, Params: %f %f %f, ",count*100, loss, lr, momentum, decay); |
|
|
|
end = clock(); |
|
|
|
end = clock(); |
|
|
|
printf("Time: %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC); |
|
|
|
printf("Time: %lf seconds\n", (float)(end-start)/CLOCKS_PER_SEC); |
|
|
|
start=end; |
|
|
|
start=end; |
|
|
|
cvWaitKey(100); |
|
|
|
cvWaitKey(100); |
|
|
|
//lr /= 2;
|
|
|
|
//lr /= 2;
|
|
|
|
if(count%5 == 0){ |
|
|
|
if(count%5 == 0){ |
|
|
|
double train_acc = network_accuracy(net, train); |
|
|
|
float train_acc = network_accuracy(net, train); |
|
|
|
fprintf(stderr, "\nTRAIN: %f\n", train_acc); |
|
|
|
fprintf(stderr, "\nTRAIN: %f\n", train_acc); |
|
|
|
double test_acc = network_accuracy(net, test); |
|
|
|
float test_acc = network_accuracy(net, test); |
|
|
|
fprintf(stderr, "TEST: %f\n\n", test_acc); |
|
|
|
fprintf(stderr, "TEST: %f\n\n", test_acc); |
|
|
|
printf("%d, %f, %f\n", count, train_acc, test_acc); |
|
|
|
printf("%d, %f, %f\n", count, train_acc, test_acc); |
|
|
|
|
|
|
|
lr *= .5; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -253,24 +256,24 @@ void test_ensemble() |
|
|
|
int n = 30; |
|
|
|
int n = 30; |
|
|
|
for(i = 0; i < n; ++i){ |
|
|
|
for(i = 0; i < n; ++i){ |
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
double lr = .0005; |
|
|
|
float lr = .0005; |
|
|
|
double momentum = .9; |
|
|
|
float momentum = .9; |
|
|
|
double decay = .01; |
|
|
|
float decay = .01; |
|
|
|
network net = parse_network_cfg("nist.cfg"); |
|
|
|
network net = parse_network_cfg("nist.cfg"); |
|
|
|
while(++count <= 15){ |
|
|
|
while(++count <= 15){ |
|
|
|
double acc = train_network_sgd(net, train, train.X.rows, lr, momentum, decay); |
|
|
|
float acc = train_network_sgd(net, train, train.X.rows, lr, momentum, decay); |
|
|
|
printf("Training Accuracy: %lf Learning Rate: %f Momentum: %f Decay: %f\n", acc, lr, momentum, decay ); |
|
|
|
printf("Training Accuracy: %lf Learning Rate: %f Momentum: %f Decay: %f\n", acc, lr, momentum, decay ); |
|
|
|
lr /= 2;
|
|
|
|
lr /= 2;
|
|
|
|
} |
|
|
|
} |
|
|
|
matrix partial = network_predict_data(net, test); |
|
|
|
matrix partial = network_predict_data(net, test); |
|
|
|
double acc = matrix_accuracy(test.y, partial); |
|
|
|
float acc = matrix_accuracy(test.y, partial); |
|
|
|
printf("Model Accuracy: %lf\n", acc); |
|
|
|
printf("Model Accuracy: %lf\n", acc); |
|
|
|
matrix_add_matrix(partial, prediction); |
|
|
|
matrix_add_matrix(partial, prediction); |
|
|
|
acc = matrix_accuracy(test.y, prediction); |
|
|
|
acc = matrix_accuracy(test.y, prediction); |
|
|
|
printf("Current Ensemble Accuracy: %lf\n", acc); |
|
|
|
printf("Current Ensemble Accuracy: %lf\n", acc); |
|
|
|
free_matrix(partial); |
|
|
|
free_matrix(partial); |
|
|
|
} |
|
|
|
} |
|
|
|
double acc = matrix_accuracy(test.y, prediction); |
|
|
|
float acc = matrix_accuracy(test.y, prediction); |
|
|
|
printf("Full Ensemble Accuracy: %lf\n", acc); |
|
|
|
printf("Full Ensemble Accuracy: %lf\n", acc); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -279,19 +282,19 @@ void test_random_classify() |
|
|
|
network net = parse_network_cfg("connected.cfg"); |
|
|
|
network net = parse_network_cfg("connected.cfg"); |
|
|
|
matrix m = csv_to_matrix("train.csv"); |
|
|
|
matrix m = csv_to_matrix("train.csv"); |
|
|
|
//matrix ho = hold_out_matrix(&m, 2500);
|
|
|
|
//matrix ho = hold_out_matrix(&m, 2500);
|
|
|
|
double *truth = pop_column(&m, 0); |
|
|
|
float *truth = pop_column(&m, 0); |
|
|
|
//double *ho_truth = pop_column(&ho, 0);
|
|
|
|
//float *ho_truth = pop_column(&ho, 0);
|
|
|
|
int i; |
|
|
|
int i; |
|
|
|
clock_t start = clock(), end; |
|
|
|
clock_t start = clock(), end; |
|
|
|
int count = 0; |
|
|
|
int count = 0; |
|
|
|
while(++count <= 300){ |
|
|
|
while(++count <= 300){ |
|
|
|
for(i = 0; i < m.rows; ++i){ |
|
|
|
for(i = 0; i < m.rows; ++i){ |
|
|
|
int index = rand()%m.rows; |
|
|
|
int index = rand()%m.rows; |
|
|
|
//image p = double_to_image(1690,1,1,m.vals[index]);
|
|
|
|
//image p = float_to_image(1690,1,1,m.vals[index]);
|
|
|
|
//normalize_image(p);
|
|
|
|
//normalize_image(p);
|
|
|
|
forward_network(net, m.vals[index]); |
|
|
|
forward_network(net, m.vals[index]); |
|
|
|
double *out = get_network_output(net); |
|
|
|
float *out = get_network_output(net); |
|
|
|
double *delta = get_network_delta(net); |
|
|
|
float *delta = get_network_delta(net); |
|
|
|
//printf("%f\n", out[0]);
|
|
|
|
//printf("%f\n", out[0]);
|
|
|
|
delta[0] = truth[index] - out[0]; |
|
|
|
delta[0] = truth[index] - out[0]; |
|
|
|
// printf("%f\n", delta[0]);
|
|
|
|
// printf("%f\n", delta[0]);
|
|
|
@ -299,8 +302,8 @@ void test_random_classify() |
|
|
|
//backward_network(net, m.vals[index], );
|
|
|
|
//backward_network(net, m.vals[index], );
|
|
|
|
update_network(net, .00001, 0,0); |
|
|
|
update_network(net, .00001, 0,0); |
|
|
|
} |
|
|
|
} |
|
|
|
//double test_acc = error_network(net, m, truth);
|
|
|
|
//float test_acc = error_network(net, m, truth);
|
|
|
|
//double valid_acc = error_network(net, ho, ho_truth);
|
|
|
|
//float valid_acc = error_network(net, ho, ho_truth);
|
|
|
|
//printf("%f, %f\n", test_acc, valid_acc);
|
|
|
|
//printf("%f, %f\n", test_acc, valid_acc);
|
|
|
|
//fprintf(stderr, "%5d: %f Valid: %f\n",count, test_acc, valid_acc);
|
|
|
|
//fprintf(stderr, "%5d: %f Valid: %f\n",count, test_acc, valid_acc);
|
|
|
|
//if(valid_acc > .70) break;
|
|
|
|
//if(valid_acc > .70) break;
|
|
|
@ -311,12 +314,12 @@ void test_random_classify() |
|
|
|
truth = pop_column(&test, 0); |
|
|
|
truth = pop_column(&test, 0); |
|
|
|
for(i = 0; i < test.rows; ++i){ |
|
|
|
for(i = 0; i < test.rows; ++i){ |
|
|
|
forward_network(net, test.vals[i]); |
|
|
|
forward_network(net, test.vals[i]); |
|
|
|
double *out = get_network_output(net); |
|
|
|
float *out = get_network_output(net); |
|
|
|
if(fabs(out[0]) < .5) fprintf(fp, "0\n"); |
|
|
|
if(fabs(out[0]) < .5) fprintf(fp, "0\n"); |
|
|
|
else fprintf(fp, "1\n"); |
|
|
|
else fprintf(fp, "1\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
fclose(fp); |
|
|
|
fclose(fp); |
|
|
|
printf("Neural Net Learning: %lf seconds\n", (double)(end-start)/CLOCKS_PER_SEC); |
|
|
|
printf("Neural Net Learning: %lf seconds\n", (float)(end-start)/CLOCKS_PER_SEC); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_split() |
|
|
|
void test_split() |
|
|
@ -326,30 +329,6 @@ void test_split() |
|
|
|
printf("%d, %d, %d\n", train.X.rows, split[0].X.rows, split[1].X.rows); |
|
|
|
printf("%d, %d, %d\n", train.X.rows, split[0].X.rows, split[1].X.rows); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
double *random_matrix(int rows, int cols) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int i, j; |
|
|
|
|
|
|
|
double *m = calloc(rows*cols, sizeof(double)); |
|
|
|
|
|
|
|
for(i = 0; i < rows; ++i){ |
|
|
|
|
|
|
|
for(j = 0; j < cols; ++j){ |
|
|
|
|
|
|
|
m[i*cols+j] = (double)rand()/RAND_MAX; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return m; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void test_blas() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int m = 1000, n = 1000, k = 1000; |
|
|
|
|
|
|
|
double *a = random_matrix(m,k); |
|
|
|
|
|
|
|
double *b = random_matrix(k,n); |
|
|
|
|
|
|
|
double *c = random_matrix(m,n); |
|
|
|
|
|
|
|
int i; |
|
|
|
|
|
|
|
for(i = 0; i<1000; ++i){ |
|
|
|
|
|
|
|
gemm(0,0,m,n,k,1,a,k,b,n,1,c,n); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void test_im2row() |
|
|
|
void test_im2row() |
|
|
|
{ |
|
|
|
{ |
|
|
|
int h = 20; |
|
|
|
int h = 20; |
|
|
@ -362,16 +341,18 @@ void test_im2row() |
|
|
|
int mw = ((h-size)/stride+1)*((w-size)/stride+1); |
|
|
|
int mw = ((h-size)/stride+1)*((w-size)/stride+1); |
|
|
|
int mh = (size*size*c); |
|
|
|
int mh = (size*size*c); |
|
|
|
int msize = mc*mw*mh; |
|
|
|
int msize = mc*mw*mh; |
|
|
|
double *matrix = calloc(msize, sizeof(double)); |
|
|
|
float *matrix = calloc(msize, sizeof(float)); |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
for(i = 0; i < 1000; ++i){ |
|
|
|
for(i = 0; i < 1000; ++i){ |
|
|
|
im2col_cpu(test.data, c, h, w, size, stride, matrix); |
|
|
|
im2col_cpu(test.data, c, h, w, size, stride, matrix); |
|
|
|
image render = double_to_image(mh, mw, mc, matrix); |
|
|
|
image render = float_to_image(mh, mw, mc, matrix); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main() |
|
|
|
int main() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
|
|
|
|
|
|
|
|
|
|
|
|
//test_blas();
|
|
|
|
//test_blas();
|
|
|
|
//test_convolve_matrix();
|
|
|
|
//test_convolve_matrix();
|
|
|
|
// test_im2row();
|
|
|
|
// test_im2row();
|
|
|
|