Skip to content

Commit

Permalink
🔥 🐛 🔥
Browse files Browse the repository at this point in the history
  • Loading branch information
pjreddie committed Jun 18, 2017
1 parent 1467621 commit 8215a88
Show file tree
Hide file tree
Showing 42 changed files with 699 additions and 497 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GPU=1
CUDNN=1
OPENCV=1
GPU=0
CUDNN=0
OPENCV=0
DEBUG=0

ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] \
Expand Down
31 changes: 16 additions & 15 deletions cfg/gru.cfg
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
[net]
inputs=256

# Test
batch = 1
time_steps=1

# Train
# batch = 512
# time_steps=64

subdivisions=1
batch = 256
inputs=256
momentum=0.9
decay=0.001
learning_rate=0.1
decay=0.0
time_steps=128
learning_rate=.002
adam=1

burn_in=100
policy=poly
policy=constant
power=4
max_batches=10000
max_batches=400000

[gru]
batch_normalize=1
output = 1024

[gru]
batch_normalize=1
output = 1024

[gru]
batch_normalize=1
Expand Down
20 changes: 20 additions & 0 deletions examples/darknet.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,26 @@ void operations(char *cfgfile)
ops += 2l * l.n * l.size*l.size*l.c * l.out_h*l.out_w;
} else if(l.type == CONNECTED){
ops += 2l * l.inputs * l.outputs;
} else if (l.type == RNN){
ops += 2l * l.input_layer->inputs * l.input_layer->outputs;
ops += 2l * l.self_layer->inputs * l.self_layer->outputs;
ops += 2l * l.output_layer->inputs * l.output_layer->outputs;
} else if (l.type == GRU){
ops += 2l * l.uz->inputs * l.uz->outputs;
ops += 2l * l.uh->inputs * l.uh->outputs;
ops += 2l * l.ur->inputs * l.ur->outputs;
ops += 2l * l.wz->inputs * l.wz->outputs;
ops += 2l * l.wh->inputs * l.wh->outputs;
ops += 2l * l.wr->inputs * l.wr->outputs;
} else if (l.type == LSTM){
ops += 2l * l.uf->inputs * l.uf->outputs;
ops += 2l * l.ui->inputs * l.ui->outputs;
ops += 2l * l.ug->inputs * l.ug->outputs;
ops += 2l * l.uo->inputs * l.uo->outputs;
ops += 2l * l.wf->inputs * l.wf->outputs;
ops += 2l * l.wi->inputs * l.wi->outputs;
ops += 2l * l.wg->inputs * l.wg->outputs;
ops += 2l * l.wo->inputs * l.wo->outputs;
}
}
printf("Floating Point Operations: %ld\n", ops);
Expand Down
68 changes: 34 additions & 34 deletions examples/lsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg
int ax_size = anet.inputs*anet.batch;
int ay_size = anet.truths*anet.batch;
fill_ongpu(ay_size, .9, anet.truth_gpu, 1);
fill_gpu(ay_size, .9, anet.truth_gpu, 1);
anet.delta_gpu = cuda_make_array(0, ax_size);
anet.train = 1;
Expand Down Expand Up @@ -102,36 +102,36 @@ void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg
forward_network_gpu(fnet, fstate);
float *feats = fnet.layers[fnet.n - 2].output_gpu;
copy_ongpu(y_size, feats, 1, fstate.truth, 1);
copy_gpu(y_size, feats, 1, fstate.truth, 1);
forward_network_gpu(gnet, gstate);
float *gen = gnet.layers[gnet.n-1].output_gpu;
copy_ongpu(x_size, gen, 1, fstate.input, 1);
copy_gpu(x_size, gen, 1, fstate.input, 1);
fill_ongpu(x_size, 0, fstate.delta, 1);
fill_gpu(x_size, 0, fstate.delta, 1);
forward_network_gpu(fnet, fstate);
backward_network_gpu(fnet, fstate);
//HERE
astate.input = gen;
fill_ongpu(ax_size, 0, astate.delta, 1);
fill_gpu(ax_size, 0, astate.delta, 1);
forward_network_gpu(anet, astate);
backward_network_gpu(anet, astate);
float *delta = imlayer.delta_gpu;
fill_ongpu(x_size, 0, delta, 1);
scal_ongpu(x_size, 100, astate.delta, 1);
scal_ongpu(x_size, .001, fstate.delta, 1);
axpy_ongpu(x_size, 1, fstate.delta, 1, delta, 1);
axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1);
fill_gpu(x_size, 0, delta, 1);
scal_gpu(x_size, 100, astate.delta, 1);
scal_gpu(x_size, .001, fstate.delta, 1);
axpy_gpu(x_size, 1, fstate.delta, 1, delta, 1);
axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
//fill_ongpu(x_size, 0, delta, 1);
//fill_gpu(x_size, 0, delta, 1);
//cuda_push_array(delta, X, x_size);
//axpy_ongpu(x_size, -1, imlayer.output_gpu, 1, delta, 1);
//axpy_gpu(x_size, -1, imlayer.output_gpu, 1, delta, 1);
//printf("pix error: %f\n", cuda_mag_array(delta, x_size));
printf("fea error: %f\n", cuda_mag_array(fstate.delta, x_size));
printf("adv error: %f\n", cuda_mag_array(astate.delta, x_size));
//axpy_ongpu(x_size, 1, astate.delta, 1, delta, 1);
//axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
backward_network_gpu(gnet, gstate);
Expand Down Expand Up @@ -273,7 +273,7 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear
float *imerror = cuda_make_array(0, imlayer.outputs);
float *ones_gpu = cuda_make_array(0, ay_size);
fill_ongpu(ay_size, .9, ones_gpu, 1);
fill_gpu(ay_size, .9, ones_gpu, 1);
float aloss_avg = -1;
float gloss_avg = -1;
Expand Down Expand Up @@ -318,23 +318,23 @@ void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear
*net.seen += net.batch;
forward_network_gpu(net, gstate);
fill_ongpu(imlayer.outputs, 0, imerror, 1);
fill_gpu(imlayer.outputs, 0, imerror, 1);
astate.input = imlayer.output_gpu;
astate.delta = imerror;
astate.truth = ones_gpu;
forward_network_gpu(anet, astate);
backward_network_gpu(anet, astate);
scal_ongpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1);
scal_gpu(imlayer.outputs, .1, net.layers[net.n-1].delta_gpu, 1);
backward_network_gpu(net, gstate);
scal_ongpu(imlayer.outputs, 1000, imerror, 1);
scal_gpu(imlayer.outputs, 1000, imerror, 1);
printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs));
printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs));
axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
gloss += get_network_cost(net) /(net.subdivisions*net.batch);
Expand Down Expand Up @@ -533,23 +533,23 @@ void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear,
*gnet.seen += gnet.batch;
forward_network_gpu(gnet);

fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
fill_ongpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1);
copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1);
fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
fill_gpu(anet.truths*anet.batch, .95, anet.truth_gpu, 1);
copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1);
anet.delta_gpu = imerror;
forward_network_gpu(anet);
backward_network_gpu(anet);

float genaloss = *anet.cost / anet.batch;
printf("%f\n", genaloss);

scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
scal_ongpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1);
scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
scal_gpu(imlayer.outputs*imlayer.batch, .00, gnet.layers[gnet.n-1].delta_gpu, 1);

printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
printf("features %f\n", cuda_mag_array(gnet.layers[gnet.n-1].delta_gpu, imlayer.outputs*imlayer.batch));

axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1);
axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet.layers[gnet.n-1].delta_gpu, 1);

backward_network_gpu(gnet);

Expand Down Expand Up @@ -716,21 +716,21 @@ void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int cle
*net.seen += net.batch;
forward_network_gpu(net);

fill_ongpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
copy_ongpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1);
fill_ongpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1);
fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
copy_gpu(anet.inputs*anet.batch, imlayer.output_gpu, 1, anet.input_gpu, 1);
fill_gpu(anet.inputs*anet.batch, .95, anet.truth_gpu, 1);
anet.delta_gpu = imerror;
forward_network_gpu(anet);
backward_network_gpu(anet);

scal_ongpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1);
scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net.layers[net.n-1].delta_gpu, 1);

scal_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);

printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
printf("features %f\n", cuda_mag_array(net.layers[net.n-1].delta_gpu, imlayer.outputs*imlayer.batch));

axpy_ongpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1);
axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net.layers[net.n-1].delta_gpu, 1);

backward_network_gpu(net);

Expand Down Expand Up @@ -876,7 +876,7 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi
float *imerror = cuda_make_array(0, imlayer.outputs);
float *ones_gpu = cuda_make_array(0, ay_size);
fill_ongpu(ay_size, 1, ones_gpu, 1);
fill_gpu(ay_size, 1, ones_gpu, 1);
float aloss_avg = -1;
float gloss_avg = -1;
Expand All @@ -902,15 +902,15 @@ void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfi
*net.seen += net.batch;
forward_network_gpu(net, gstate);
fill_ongpu(imlayer.outputs, 0, imerror, 1);
fill_gpu(imlayer.outputs, 0, imerror, 1);
astate.input = imlayer.output_gpu;
astate.delta = imerror;
astate.truth = ones_gpu;
forward_network_gpu(anet, astate);
backward_network_gpu(anet, astate);
scal_ongpu(imlayer.outputs, 1, imerror, 1);
axpy_ongpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
scal_gpu(imlayer.outputs, 1, imerror, 1);
axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
backward_network_gpu(net, gstate);
Expand Down
4 changes: 2 additions & 2 deletions examples/nightmare.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void optimize_picture(network *net, image orig, int max_layer, float scale, floa
cuda_push_array(net->input_gpu, im.data, net->inputs);

forward_network_gpu(*net);
copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);
copy_gpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);

cuda_pull_array(last.delta_gpu, last.delta, last.outputs);
calculate_loss(last.delta, last.delta, last.outputs, thresh);
Expand Down Expand Up @@ -141,7 +141,7 @@ void reconstruct_picture(network net, float *features, image recon, image update

forward_network_gpu(net);
cuda_push_array(l.delta_gpu, features, l.outputs);
axpy_ongpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1);
axpy_gpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1);
backward_network_gpu(net);

cuda_pull_array(net.delta_gpu, delta.data, delta.w*delta.h*delta.c);
Expand Down
5 changes: 4 additions & 1 deletion examples/rnn.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ void reset_rnn_state(network net, int b)
#ifdef GPU
layer l = net.layers[i];
if(l.state_gpu){
fill_ongpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1);
fill_gpu(l.outputs, 0, l.state_gpu + l.outputs*b, 1);
}
if(l.h_gpu){
fill_gpu(l.outputs, 0, l.h_gpu + l.outputs*b, 1);
}
#endif
}
Expand Down
29 changes: 20 additions & 9 deletions examples/segmenter.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus,
}
srand(time(0));
network net = nets[0];
image pred = get_network_image(net);

int div = net.w/pred.w;
assert(pred.w * div == net.w);
assert(pred.h * div == net.h);

int imgs = net.batch * net.subdivisions * ngpus;

Expand All @@ -46,6 +51,7 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus,
args.w = net.w;
args.h = net.h;
args.threads = 32;
args.scale = div;

args.min = net.min_crop;
args.max = net.max_crop;
Expand Down Expand Up @@ -75,15 +81,6 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus,
pthread_join(load_thread, 0);
train = buffer;
load_thread = load_data(args);
image tr = float_to_image(net.w, net.h, 81, train.y.vals[0]);
image im = float_to_image(net.w, net.h, net.c, train.X.vals[0]);
image mask = mask_to_rgb(tr);
show_image(im, "input");
show_image(mask, "truth");
#ifdef OPENCV
cvWaitKey(100);
#endif
free_image(mask);

printf("Loaded: %lf seconds\n", sec(clock()-time));
time=clock();
Expand All @@ -98,6 +95,20 @@ void train_segmenter(char *datacfg, char *cfgfile, char *weightfile, int *gpus,
#else
loss = train_network(net, train);
#endif
if(1){
image tr = float_to_image(net.w/div, net.h/div, 80, train.y.vals[net.batch]);
image im = float_to_image(net.w, net.h, net.c, train.X.vals[net.batch]);
image mask = mask_to_rgb(tr);
image prmask = mask_to_rgb(pred);
show_image(im, "input");
show_image(prmask, "pred");
show_image(mask, "truth");
#ifdef OPENCV
cvWaitKey(100);
#endif
free_image(mask);
free_image(prmask);
}
if(avg_loss == -1) avg_loss = loss;
avg_loss = avg_loss*.9 + loss*.1;
printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net.seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net.seen);
Expand Down
19 changes: 14 additions & 5 deletions include/darknet.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ typedef enum {
} LAYER_TYPE;

typedef enum{
SSE, MASKED, L1, SMOOTH
SSE, MASKED, L1, SEG, SMOOTH
} COST_TYPE;

typedef struct{
Expand Down Expand Up @@ -203,6 +203,8 @@ struct layer{
float * forgot_state;
float * forgot_delta;
float * state_delta;
float * combine_cpu;
float * combine_delta_cpu;

float * concat;
float * concat_delta;
Expand Down Expand Up @@ -271,6 +273,10 @@ struct layer{
struct layer *self_layer;
struct layer *output_layer;

struct layer *reset_layer;
struct layer *update_layer;
struct layer *state_layer;

struct layer *input_gate_layer;
struct layer *state_gate_layer;
struct layer *input_save_layer;
Expand Down Expand Up @@ -335,6 +341,9 @@ struct layer{
float *bias_v_gpu;
float *scale_v_gpu;

float * combine_gpu;
float * combine_delta_gpu;

float * prev_state_gpu;
float * forgot_state_gpu;
float * forgot_delta_gpu;
Expand Down Expand Up @@ -575,10 +584,10 @@ void normalize_cpu(float *x, float *mean, float *variance, int batch, int filter

int best_3d_shift_r(image a, image b, int min, int max);
#ifdef GPU
void axpy_ongpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY);
void fill_ongpu(int N, float ALPHA, float * X, int INCX);
void scal_ongpu(int N, float ALPHA, float * X, int INCX);
void copy_ongpu(int N, float * X, int INCX, float * Y, int INCY);
void axpy_gpu(int N, float ALPHA, float * X, int INCX, float * Y, int INCY);
void fill_gpu(int N, float ALPHA, float * X, int INCX);
void scal_gpu(int N, float ALPHA, float * X, int INCX);
void copy_gpu(int N, float * X, int INCX, float * Y, int INCY);

void cuda_set_device(int n);
void cuda_free(float *x_gpu);
Expand Down
Loading

0 comments on commit 8215a88

Please sign in to comment.