56 if(weights && weights[0] != 0){
59 if(clear) (*net->
seen) = 0;
72 for (i = 0; i < net->
n; ++i) {
104 if(net->
steps[i] > batch_num)
return rate;
117 fprintf(stderr,
"Policy is weird!\n");
126 return "convolutional";
132 return "deconvolutional";
168 return "normalization";
182 net->
seen = calloc(1,
sizeof(
size_t));
183 net->
t = calloc(1,
sizeof(
int));
184 net->
cost = calloc(1,
sizeof(
float));
192 forward_network_gpu(netp);
198 for(i = 0; i < net.
n; ++i){
217 update_network_gpu(netp);
235 for(i = 0; i < net.
n; ++i){
249 for(i = 0; i < net.
n; ++i){
255 *net.
cost = sum/count;
267 backward_network_gpu(netp);
274 for(i = net.
n-1; i >= 0; --i){
302 int batch = net->
batch;
306 for(i = 0; i < n; ++i){
311 return (
float)sum/(n*batch);
317 int batch = net->
batch;
318 int n = d.
X.
rows / batch;
322 for(i = 0; i < n; ++i){
327 return (
float)sum/(n*batch);
333 for(i = 0; i < net->
n; ++i){
343 for(i = 0; i < net->
n; ++i){
347 cudnn_convolutional_setup(net->
layers + i);
351 cudnnSetTensor4dDescriptor(l->dstTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->
out_c, l->
out_h, l->
out_w);
352 cudnnSetTensor4dDescriptor(l->normTensorDesc, CUDNN_TENSOR_NCHW, CUDNN_DATA_FLOAT, 1, l->
out_c, 1, 1);
369 size_t workspace_size = 0;
372 for (i = 0; i < net->
n; ++i){
399 error(
"Cannot resize this type of layer");
421 cuda_free(net->input_gpu);
422 cuda_free(net->truth_gpu);
426 net->
workspace = cuda_make_array(0, (workspace_size-1)/
sizeof(
float)+1);
430 net->
workspace = calloc(1, workspace_size);
434 net->
workspace = calloc(1, workspace_size);
443 for(i = 0; i < net->
n; ++i){
448 fprintf(stderr,
"Detection layer not found!!\n");
469 for(i = net->
n-1; i >= 0; --i){
471 if(m.
h != 0)
return m;
482 for(i = 0; i < net->
n; ++i){
483 sprintf(buff,
"Layer %d", i);
514 for(i = 0; i < net->
n; ++i){
531 if(num) *num = nboxes;
533 for(i = 0; i < nboxes; ++i){
536 dets[i].
mask = calloc(l.
coords-4,
sizeof(
float));
545 for(j = 0; j < net->
n; ++j){
572 for(i = 0; i < n; ++i){
574 if(dets[i].mask) free(dets[i].mask);
596 float *X = calloc(net->
batch*test.
X.
rows,
sizeof(
float));
598 for(b = 0; b < net->
batch; ++b){
599 if(i+b == test.
X.
rows)
break;
602 for(m = 0; m < n; ++m){
604 for(b = 0; b < net->
batch; ++b){
605 if(i+b == test.
X.
rows)
break;
606 for(j = 0; j < k; ++j){
607 pred.
vals[i+b][j] += out[j+b*k]/n;
621 float *X = calloc(net->
batch*test.
X.
cols,
sizeof(
float));
623 for(b = 0; b < net->
batch; ++b){
624 if(i+b == test.
X.
rows)
break;
628 for(b = 0; b < net->
batch; ++b){
629 if(i+b == test.
X.
rows)
break;
630 for(j = 0; j < k; ++j){
631 pred.
vals[i+b][j] = out[j+b*k];
642 for(i = 0; i < net->
n; ++i){
648 fprintf(stderr,
"Layer %d - Mean: %f, Variance: %f\n",i,mean, vari);
650 for(j = 0; j < n; ++j) fprintf(stderr,
"%f, ", output[j]);
651 if(n == 100)fprintf(stderr,
".....\n");
652 fprintf(stderr,
"\n");
663 for(i = 0; i < g1.
rows; ++i){
675 printf(
"%5d %5d\n%5d %5d\n", a, b, c, d);
676 float num = pow((abs(b - c) - 1.), 2.);
678 printf(
"%f\n", num/den);
702 for(i = net->
n - 1; i >= 0; --i){
719 for(i = 0; i < net->
n; ++i){
726 if(net->input_gpu) cuda_free(net->input_gpu);
727 if(net->truth_gpu) cuda_free(net->truth_gpu);
739 for(i = net->
n - 1; i >= 0; --i){
762 void forward_network_gpu(
network *netp)
772 for(i = 0; i < net.
n; ++i){
779 net.input_gpu = l.output_gpu;
782 net.truth_gpu = l.output_gpu;
786 pull_network_output(netp);
790 void backward_network_gpu(
network *netp)
796 for(i = net.
n-1; i >= 0; --i){
805 net.input_gpu = prev.output_gpu;
806 net.delta_gpu = prev.delta_gpu;
813 void update_network_gpu(
network *netp)
830 for(i = 0; i < net.
n; ++i){
838 void harmless_update_network_gpu(
network *netp)
843 for(i = 0; i < net.
n; ++i){
847 if(l.scale_updates_gpu)
fill_gpu(l.
nbiases, 0, l.scale_updates_gpu, 1);
857 void *train_thread(
void *ptr)
859 train_args args = *(train_args*)ptr;
866 pthread_t train_network_in_thread(
network *
net,
data d,
float *err)
869 train_args *ptr = (train_args *)calloc(1,
sizeof(train_args));
873 if(pthread_create(&thread, 0, train_thread, ptr))
error(
"Thread creation failed");
891 void scale_weights(
layer l,
float s)
906 void pull_weights(
layer l)
918 void push_weights(
layer l)
921 cuda_push_array(l.biases_gpu, l.
biases, l.
n);
933 cuda_push_array(l.biases_gpu, base.
biases, l.
n);
935 if (base.
scales) cuda_push_array(l.scales_gpu, base.
scales, l.
n);
1027 void sync_layer(
network **nets,
int n,
int j)
1032 scale_weights(base, 0);
1033 for (i = 0; i < n; ++i) {
1037 merge_weights(l, base);
1039 scale_weights(base, 1./n);
1040 for (i = 0; i < n; ++i) {
1043 distribute_weights(l, base);
1053 void *sync_layer_thread(
void *ptr)
1055 sync_args args = *(sync_args*)ptr;
1056 sync_layer(args.nets, args.n, args.j);
1061 pthread_t sync_layer_in_thread(
network **nets,
int n,
int j)
1064 sync_args *ptr = (sync_args *)calloc(1,
sizeof(sync_args));
1068 if(pthread_create(&thread, 0, sync_layer_thread, ptr))
error(
"Thread creation failed");
1072 void sync_nets(
network **nets,
int n,
int interval)
1075 int layers = nets[0]->
n;
1076 pthread_t *threads = (pthread_t *) calloc(layers,
sizeof(pthread_t));
1079 for (j = 0; j < n; ++j){
1080 *(nets[j]->
seen) = *(nets[0]->seen);
1082 for (j = 0; j < layers; ++j) {
1083 threads[j] = sync_layer_in_thread(nets, n, j);
1085 for (j = 0; j < layers; ++j) {
1086 pthread_join(threads[j], 0);
1091 float train_networks(
network **nets,
int n,
data d,
int interval)
1094 int batch = nets[0]->
batch;
1096 assert(batch * subdivisions * n == d.
X.
rows);
1097 pthread_t *threads = (pthread_t *) calloc(n,
sizeof(pthread_t));
1098 float *errors = (
float *) calloc(n,
sizeof(
float));
1101 for(i = 0; i < n; ++i){
1103 threads[i] = train_network_in_thread(nets[i], p, errors + i);
1105 for(i = 0; i < n; ++i){
1106 pthread_join(threads[i], 0);
1112 printf(
"Syncing... ");
1114 sync_nets(nets, n, interval);
1120 return (
float)sum/(n);
1123 void pull_network_output(
network *net)
void resize_normalization_layer(layer *layer, int w, int h)
image * visualize_convolutional_layer(convolutional_layer l, char *window, image *prev_weights)
void get_random_batch(data d, int n, float *X, float *y)
float train_network_sgd(network *net, data d, int n)
void visualize_network(network *net)
void reset_rnn(network *net)
float variance_array(float *a, int n)
int network_width(network *net)
matrix network_predict_data_multi(network *net, data test, int n)
float get_current_rate(network *net)
void resize_shortcut_layer(layer *l, int w, int h)
int max_index(float *a, int n)
void(* update)(struct layer, update_args)
void(* forward_gpu)(struct layer, struct network)
void free_network(network *net)
image get_network_image(network *net)
int network_inputs(network *net)
float * network_predict(network *net, float *input)
void get_region_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, float tree_thresh, int relative, detection *dets)
matrix network_predict_data(network *net, data test)
void free_detections(detection *dets, int n)
void(* backward_gpu)(struct layer, struct network)
int yolo_num_detections(layer l, float thresh)
void print_network(network *net)
void top_k(float *a, int n, int k, int *index)
void resize_reorg_layer(layer *l, int w, int h)
void(* update_gpu)(struct layer, update_args)
int get_yolo_detections(layer l, int w, int h, int netw, int neth, float thresh, int *map, int relative, detection *dets)
void resize_avgpool_layer(avgpool_layer *l, int w, int h)
layer get_network_detection_layer(network *net)
void(* forward)(struct layer, struct network)
image float_to_image(int w, int h, int c, float *data)
void fill_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, detection *dets)
network * parse_network_cfg(char *filename)
detection * get_network_boxes(network *net, int w, int h, float thresh, float hier, int *map, int relative, int *num)
void fill_gpu(int N, float ALPHA, float *X, int INCX)
size_t get_current_batch(network *net)
void get_detection_detections(layer l, int w, int h, float thresh, detection *dets)
image get_network_image_layer(network *net, int i)
void update_network(network *netp)
float network_accuracy(network *net, data d)
float * network_predict_image(network *net, image im)
int resize_network(network *net, int w, int h)
void backward_network(network *netp)
void fill_cpu(int N, float ALPHA, float *X, int INCX)
void resize_yolo_layer(layer *l, int w, int h)
float mean_array(float *a, int n)
network * load_network(char *cfg, char *weights, int clear)
void resize_maxpool_layer(maxpool_layer *l, int w, int h)
void resize_region_layer(layer *l, int w, int h)
void get_next_batch(data d, int n, int offset, float *X, float *y)
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void(* backward)(struct layer, struct network)
int network_outputs(network *net)
void resize_cost_layer(cost_layer *l, int inputs)
int num_detections(network *net, float thresh)
void scal_cpu(int N, float ALPHA, float *X, int INCX)
void resize_crop_layer(layer *l, int w, int h)
void resize_convolutional_layer(convolutional_layer *l, int w, int h)
void top_predictions(network *net, int k, int *index)
data get_data_part(data d, int part, int total)
layer network_output_layer(network *net)
void free_matrix(matrix m)
float train_network(network *net, data d)
void cuda_set_device(int n)
void reset_network_state(network *net, int b)
void set_batch_network(network *net, int b)
int get_predicted_class_network(network *net)
void resize_upsample_layer(layer *l, int w, int h)
load_args get_base_args(network *net)
int network_height(network *net)
void compare_networks(network *n1, network *n2, data test)
layer get_network_output_layer(network *net)
matrix make_matrix(int rows, int cols)
float * network_output(network *net)
detection * make_network_boxes(network *net, float thresh, int *num)
network * make_network(int n)
float matrix_topk_accuracy(matrix truth, matrix guess, int k)
float network_accuracy_multi(network *net, data d, int n)
void set_temp_network(network *net, float t)
void resize_route_layer(route_layer *l, network *net)
float rand_uniform(float min, float max)
void calc_network_cost(network *netp)
float train_network_datum(network *net)
float * network_accuracies(network *net, data d, int n)
void error(const char *s)
learning_rate_policy policy
void load_weights(network *net, char *filename)
char * get_layer_string(LAYER_TYPE a)
void forward_network(network *netp)