From 252e3b1916cfaca0783c9e90efaa55eb07b1a8cd Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Sun, 06 Nov 2016 00:27:31 +0000
Subject: [PATCH] :charizard: :charizard: :charizard:
---
src/parser.c | 88 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 79 insertions(+), 9 deletions(-)
diff --git a/src/parser.c b/src/parser.c
index e04c6c2..26f45d3 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -111,6 +111,7 @@
int c;
int index;
int time_steps;
+ network net;
} size_params;
local_layer parse_local(list *options, size_params params)
@@ -156,9 +157,14 @@
int binary = option_find_int_quiet(options, "binary", 0);
int xnor = option_find_int_quiet(options, "xnor", 0);
- convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,size,stride,padding,activation, batch_normalize, binary, xnor);
+ convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,size,stride,padding,activation, batch_normalize, binary, xnor, params.net.adam);
layer.flipped = option_find_int_quiet(options, "flipped", 0);
layer.dot = option_find_float_quiet(options, "dot", 0);
+ if(params.net.adam){
+ layer.B1 = params.net.B1;
+ layer.B2 = params.net.B2;
+ layer.eps = params.net.eps;
+ }
return layer;
}
@@ -226,6 +232,21 @@
return layer;
}
+int *read_map(char *filename)
+{
+ int n = 0;
+ int *map = 0;
+ char *str;
+ FILE *file = fopen(filename, "r");
+ if(!file) file_error(filename);
+ while((str=fgetl(file))){
+ ++n;
+ map = realloc(map, n*sizeof(int));
+ map[n-1] = atoi(str);
+ }
+ return map;
+}
+
layer parse_region(list *options, size_params params)
{
int coords = option_find_int(options, "coords", 4);
@@ -246,10 +267,33 @@
l.jitter = option_find_float(options, "jitter", .2);
l.rescore = option_find_int_quiet(options, "rescore",0);
+ l.thresh = option_find_float(options, "thresh", .5);
+
l.coord_scale = option_find_float(options, "coord_scale", 1);
l.object_scale = option_find_float(options, "object_scale", 1);
l.noobject_scale = option_find_float(options, "noobject_scale", 1);
l.class_scale = option_find_float(options, "class_scale", 1);
+ l.bias_match = option_find_int_quiet(options, "bias_match",0);
+
+ char *tree_file = option_find_str(options, "tree", 0);
+ if (tree_file) l.softmax_tree = read_tree(tree_file);
+ char *map_file = option_find_str(options, "map", 0);
+ if (map_file) l.map = read_map(map_file);
+
+ char *a = option_find_str(options, "anchors", 0);
+ if(a){
+ int len = strlen(a);
+ int n = 1;
+ int i;
+ for(i = 0; i < len; ++i){
+ if (a[i] == ',') ++n;
+ }
+ for(i = 0; i < n; ++i){
+ float bias = atof(a);
+ l.biases[i] = bias;
+ a = strchr(a, ',')+1;
+ }
+ }
return l;
}
detection_layer parse_detection(list *options, size_params params)
@@ -482,6 +526,13 @@
net->batch *= net->time_steps;
net->subdivisions = subdivs;
+ net->adam = option_find_int_quiet(options, "adam", 0);
+ if(net->adam){
+ net->B1 = option_find_float(options, "B1", .9);
+ net->B2 = option_find_float(options, "B2", .999);
+ net->eps = option_find_float(options, "eps", .000001);
+ }
+
net->h = option_find_int_quiet(options, "height",0);
net->w = option_find_int_quiet(options, "width",0);
net->c = option_find_int_quiet(options, "channels",0);
@@ -564,6 +615,7 @@
params.inputs = net.inputs;
params.batch = net.batch;
params.time_steps = net.time_steps;
+ params.net = net;
size_t workspace_size = 0;
n = n->next;
@@ -745,6 +797,10 @@
fwrite(l.rolling_variance, sizeof(float), l.n, fp);
}
fwrite(l.weights, sizeof(float), num, fp);
+ if(l.adam){
+ fwrite(l.m, sizeof(float), num, fp);
+ fwrite(l.v, sizeof(float), num, fp);
+ }
}
void save_batchnorm_weights(layer l, FILE *fp)
@@ -779,7 +835,7 @@
{
#ifdef GPU
if(net.gpu_index >= 0){
- cuda_set_device(net.gpu_index);
+ cuda_set_device(net.gpu_index);
}
#endif
fprintf(stderr, "Saving weights to %s\n", filename);
@@ -923,13 +979,27 @@
//return;
}
int num = l.n*l.c*l.size*l.size;
- fread(l.biases, sizeof(float), l.n, fp);
- if (l.batch_normalize && (!l.dontloadscales)){
- fread(l.scales, sizeof(float), l.n, fp);
- fread(l.rolling_mean, sizeof(float), l.n, fp);
- fread(l.rolling_variance, sizeof(float), l.n, fp);
+ if(0){
+ fread(l.biases + ((l.n != 1374)?0:5), sizeof(float), l.n, fp);
+ if (l.batch_normalize && (!l.dontloadscales)){
+ fread(l.scales + ((l.n != 1374)?0:5), sizeof(float), l.n, fp);
+ fread(l.rolling_mean + ((l.n != 1374)?0:5), sizeof(float), l.n, fp);
+ fread(l.rolling_variance + ((l.n != 1374)?0:5), sizeof(float), l.n, fp);
+ }
+ fread(l.weights + ((l.n != 1374)?0:5*l.c*l.size*l.size), sizeof(float), num, fp);
+ }else{
+ fread(l.biases, sizeof(float), l.n, fp);
+ if (l.batch_normalize && (!l.dontloadscales)){
+ fread(l.scales, sizeof(float), l.n, fp);
+ fread(l.rolling_mean, sizeof(float), l.n, fp);
+ fread(l.rolling_variance, sizeof(float), l.n, fp);
+ }
+ fread(l.weights, sizeof(float), num, fp);
}
- fread(l.weights, sizeof(float), num, fp);
+ if(l.adam){
+ fread(l.m, sizeof(float), num, fp);
+ fread(l.v, sizeof(float), num, fp);
+ }
//if(l.c == 3) scal_cpu(num, 1./256, l.weights, 1);
if (l.flipped) {
transpose_matrix(l.weights, l.c*l.size*l.size, l.n);
@@ -947,7 +1017,7 @@
{
#ifdef GPU
if(net->gpu_index >= 0){
- cuda_set_device(net->gpu_index);
+ cuda_set_device(net->gpu_index);
}
#endif
fprintf(stderr, "Loading weights from %s...", filename);
--
Gitblit v1.10.0