From e82505d20e35a02d436ff43c925d49553d829db3 Mon Sep 17 00:00:00 2001 From: AlexeyAB Date: Thu, 28 Feb 2019 16:55:30 +0300 Subject: [PATCH] Fixed random values --- build/darknet/x64/partial.cmd | 3 ++ src/detection_layer.c | 2 +- src/maxpool_layer.c | 2 +- src/network.c | 2 +- src/nightmare.c | 2 +- src/region_layer.c | 2 +- src/utils.c | 82 +++++++++++++++++++++++++++++------ src/utils.h | 5 +++ src/yolo_layer.c | 2 +- 9 files changed, 82 insertions(+), 20 deletions(-) diff --git a/build/darknet/x64/partial.cmd b/build/darknet/x64/partial.cmd index bea737ea..f0c2b9e8 100644 --- a/build/darknet/x64/partial.cmd +++ b/build/darknet/x64/partial.cmd @@ -27,6 +27,9 @@ darknet.exe partial cfg/yolov2.cfg yolov2.weights yolov2.conv.23 23 darknet.exe partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81 +darknet.exe partial cfg/yolov3-spp.cfg yolov3-spp.weights yolov3-spp.conv.85 85 + + darknet.exe partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15 diff --git a/src/detection_layer.c b/src/detection_layer.c index 1379145b..60fdc90d 100644 --- a/src/detection_layer.c +++ b/src/detection_layer.c @@ -41,7 +41,7 @@ detection_layer make_detection_layer(int batch, int inputs, int n, int side, int #endif fprintf(stderr, "Detection Layer\n"); - srand(0); + srand(time(0)); return l; } diff --git a/src/maxpool_layer.c b/src/maxpool_layer.c index 6c2ebca2..cf99e619 100644 --- a/src/maxpool_layer.c +++ b/src/maxpool_layer.c @@ -29,7 +29,7 @@ void cudnn_maxpool_setup(layer *l) maxpool_status = cudnnSetPooling2dDescriptor( l->poolingDesc, CUDNN_POOLING_MAX, - CUDNN_PROPAGATE_NAN, // CUDNN_PROPAGATE_NAN, CUDNN_NOT_PROPAGATE_NAN + CUDNN_NOT_PROPAGATE_NAN, // CUDNN_PROPAGATE_NAN, CUDNN_NOT_PROPAGATE_NAN l->size, l->size, 0, //l.pad, diff --git a/src/network.c b/src/network.c index 762ddb67..134f7e92 100644 --- a/src/network.c +++ b/src/network.c @@ -348,7 +348,7 @@ float train_network_batch(network net, data d, int n) int batch = 2; for(i = 0; i < n; ++i){ for(j = 0; j < batch; ++j){ - int index = rand()%d.X.rows; + int index = random_gen()%d.X.rows; state.input = d.X.vals[index]; state.truth = d.y.vals[index]; forward_network(net, state); diff --git a/src/nightmare.c b/src/nightmare.c index 2d4c7466..bd8ccc3b 100644 --- a/src/nightmare.c +++ b/src/nightmare.c @@ -181,7 +181,7 @@ void reconstruct_picture(network net, float *features, image recon, image update void run_nightmare(int argc, char **argv) { - srand(0); + srand(time(0)); if(argc < 4){ fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [layer] [options! (optional)]\n", argv[0], argv[1]); return; diff --git a/src/region_layer.c b/src/region_layer.c index af61a043..3221e77e 100644 --- a/src/region_layer.c +++ b/src/region_layer.c @@ -46,7 +46,7 @@ region_layer make_region_layer(int batch, int w, int h, int n, int classes, int #endif fprintf(stderr, "detection\n"); - srand(0); + srand(time(0)); return l; } diff --git a/src/utils.c b/src/utils.c index 22633125..b4d17c23 100644 --- a/src/utils.c +++ b/src/utils.c @@ -60,7 +60,7 @@ void shuffle(void *arr, size_t n, size_t size) size_t i; void* swp = (void*)calloc(1, size); for(i = 0; i < n-1; ++i){ - size_t j = i + rand()/(RAND_MAX / (n-i)+1); + size_t j = i + random_gen()/(RAND_MAX / (n-i)+1); memcpy(swp, (char*)arr+(j*size), size); memcpy((char*)arr+(j*size), (char*)arr+(i*size), size); memcpy((char*)arr+(i*size), swp, size); @@ -699,7 +699,7 @@ int rand_int(int min, int max) min = max; max = s; } - int r = (rand()%(max - min + 1)) + min; + int r = (random_gen()%(max - min + 1)) + min; return r; } @@ -717,10 +717,10 @@ float rand_normal() haveSpare = 1; - rand1 = rand() / ((double) RAND_MAX); + rand1 = random_gen() / ((double) RAND_MAX); if(rand1 < 1e-100) rand1 = 1e-100; rand1 = -2 * log(rand1); - rand2 = (rand() / ((double)RAND_MAX)) * 2.0 * M_PI; + rand2 = (random_gen() / ((double)RAND_MAX)) * 2.0 * M_PI; return sqrt(rand1) * cos(rand2); } @@ -731,21 +731,21 @@ float rand_normal() int n = 12; int i; float sum= 0; - for(i = 0; i < n; ++i) sum += (float)rand()/RAND_MAX; + for(i = 0; i < n; ++i) sum += (float)random_gen()/RAND_MAX; return sum-n/2.; } */ size_t rand_size_t() { - return ((size_t)(rand()&0xff) << 56) | - ((size_t)(rand()&0xff) << 48) | - ((size_t)(rand()&0xff) << 40) | - ((size_t)(rand()&0xff) << 32) | - ((size_t)(rand()&0xff) << 24) | - ((size_t)(rand()&0xff) << 16) | - ((size_t)(rand()&0xff) << 8) | - ((size_t)(rand()&0xff) << 0); + return ((size_t)(random_gen()&0xff) << 56) | + ((size_t)(random_gen()&0xff) << 48) | + ((size_t)(random_gen()&0xff) << 40) | + ((size_t)(random_gen()&0xff) << 32) | + ((size_t)(random_gen()&0xff) << 24) | + ((size_t)(random_gen()&0xff) << 16) | + ((size_t)(random_gen()&0xff) << 8) | + ((size_t)(random_gen()&0xff) << 0); } float rand_uniform(float min, float max) @@ -755,7 +755,14 @@ float rand_uniform(float min, float max) min = max; max = swap; } - return ((float)rand()/RAND_MAX * (max - min)) + min; + + if (RAND_MAX < 65536) { + int rnd = rand()*(RAND_MAX + 1) + rand(); + return ((float)rnd / (RAND_MAX*RAND_MAX) * (max - min)) + min; + } + else { + return ((float)rand() / RAND_MAX * (max - min)) + min; + } //return (random_float() * (max - min)) + min; } @@ -785,6 +792,9 @@ unsigned int random_gen() rand_s(&rnd); #else rnd = rand(); + if (RAND_MAX < 65536) { + rnd = rand()*(RAND_MAX + 1) + rnd; + } #endif return rnd; } @@ -807,3 +817,47 @@ float rand_uniform_strong(float min, float max) } return (random_float() * (max - min)) + min; } + +float rand_precalc_random(float min, float max, float random_part) +{ + if (max < min) { + float swap = min; + min = max; + max = swap; + } + return (random_part * (max - min)) + min; +} + +#define RS_SCALE (1.0 / (1.0 + RAND_MAX)) + +double double_rand(void) +{ + double d; + do { + d = (((rand() * RS_SCALE) + rand()) * RS_SCALE + rand()) * RS_SCALE; + } while (d >= 1); // Round off + return d; +} + +unsigned int uint_rand(unsigned int less_than) +{ + return (unsigned int)((less_than)* double_rand()); +} + +int check_array_is_nan(float *arr, int size) +{ + int i; + for (i = 0; i < size; ++i) { + if (isnan(arr[i])) return 1; + } + return 0; +} + +int check_array_is_inf(float *arr, int size) +{ + int i; + for (i = 0; i < size; ++i) { + if (isinf(arr[i])) return 1; + } + return 0; +} diff --git a/src/utils.h b/src/utils.h index f00ed2d5..bae6adff 100644 --- a/src/utils.h +++ b/src/utils.h @@ -70,6 +70,11 @@ void print_statistics(float *a, int n); unsigned int random_gen(); float random_float(); float rand_uniform_strong(float min, float max); +float rand_precalc_random(float min, float max, float random_part); +double double_rand(void); +unsigned int uint_rand(unsigned int less_than); +int check_array_is_nan(float *arr, int size); +int check_array_is_inf(float *arr, int size); int int_index(int *a, int val, int n); #ifdef __cplusplus diff --git a/src/yolo_layer.c b/src/yolo_layer.c index 134c9c90..a9309d1d 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -70,7 +70,7 @@ layer make_yolo_layer(int batch, int w, int h, int n, int total, int *mask, int #endif fprintf(stderr, "yolo\n"); - srand(0); + srand(time(0)); return l; }