From db0397cfaaf488364e3d2e1669dfefae2ee6ea73 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Mon, 14 Dec 2015 19:57:10 +0000
Subject: [PATCH] shortcut layers, msr networks

---
 src/yolo.c                  |    5 
 Makefile                    |    2 
 src/classifier.c            |    7 
 src/convolutional_layer.h   |    1 
 src/image.c                 |    7 
 cfg/msr_34.cfg              |  371 ++++++++
 src/crop_layer.h            |    1 
 src/deconvolutional_layer.h |    1 
 src/blas.c                  |   16 
 src/local_layer.h           |    2 
 src/layer.h                 |   12 
 src/cost_layer.h            |    2 
 src/network.c               |   15 
 src/maxpool_layer.h         |    1 
 src/normalization_layer.h   |    2 
 src/softmax_layer.h         |    1 
 src/network.h               |   13 
 src/params.h                |   11 
 src/dropout_layer.h         |    1 
 src/network_kernels.cu      |   11 
 src/connected_layer.c       |   32 
 src/connected_layer.h       |    2 
 src/data.c                  |   92 ++
 src/detection_layer.h       |    2 
 src/blas.h                  |    2 
 cfg/msr_152.cfg             | 1408 +++++++++++++++++++++++++++++++
 src/data.h                  |    3 
 src/detection_layer.c       |    2 
 src/cuda.c                  |    1 
 src/shortcut_layer.h        |   16 
 src/shortcut_layer.c        |   64 +
 src/parser.c                |   68 +
 src/avgpool_layer.h         |    2 
 cfg/msr_50.cfg              |  490 ++++++++++
 src/blas_kernels.cu         |   25 
 35 files changed, 2,635 insertions(+), 56 deletions(-)

diff --git a/Makefile b/Makefile
index d5c75e0..9116408 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@
 LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
 endif
 
-OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o imagenet.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o layer.o compare.o classifier.o local_layer.o
+OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o imagenet.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o layer.o compare.o classifier.o local_layer.o swag.o shortcut_layer.o
 ifeq ($(GPU), 1) 
 OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o softmax_layer_kernels.o network_kernels.o avgpool_layer_kernels.o yolo_kernels.o coco_kernels.o
 endif
diff --git a/cfg/msr_152.cfg b/cfg/msr_152.cfg
new file mode 100644
index 0000000..5d5a3b2
--- /dev/null
+++ b/cfg/msr_152.cfg
@@ -0,0 +1,1408 @@
+[net]
+batch=256
+subdivisions=16
+height=256
+width=256
+channels=3
+momentum=0.9
+decay=0.0005
+
+learning_rate=0.02
+
+[crop]
+crop_height=224
+crop_width=224
+flip=1
+saturation=1
+exposure=1
+angle=0
+
+##### Conv 1 #####
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=7
+stride=2
+pad=1
+activation=leaky
+
+[maxpool]
+size=3
+stride=2
+
+
+##### Conv 2_x #####
+
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 3_x #####
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 4_x #####
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 5_x #####
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[avgpool]
+
+[connected]
+output=1000
+activation=leaky
+
+[softmax]
+groups=1
+
+[cost]
+type=sse
+
diff --git a/cfg/msr_34.cfg b/cfg/msr_34.cfg
new file mode 100644
index 0000000..e561d45
--- /dev/null
+++ b/cfg/msr_34.cfg
@@ -0,0 +1,371 @@
+[net]
+batch=128
+subdivisions=1
+height=256
+width=256
+channels=3
+momentum=0.9
+decay=0.0005
+
+learning_rate=0.1
+policy=poly
+power=4
+max_batches=500000
+
+#policy=sigmoid
+#gamma=.00008
+#step=100000
+#max_batches=200000
+
+[crop]
+crop_height=224
+crop_width=224
+flip=1
+saturation=1
+exposure=1
+angle=0
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=7
+stride=2
+pad=1
+activation=leaky
+
+[maxpool]
+size=3
+stride=2
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+
+
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+
+
+
+
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+
+
+
+
+
+
+
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -3
+
+[avgpool]
+
+[connected]
+output=1000
+activation=leaky
+
+[softmax]
+groups=1
+
+[cost]
+type=sse
+
diff --git a/cfg/msr_50.cfg b/cfg/msr_50.cfg
new file mode 100644
index 0000000..31685f2
--- /dev/null
+++ b/cfg/msr_50.cfg
@@ -0,0 +1,490 @@
+[net]
+batch=128
+subdivisions=4
+height=256
+width=256
+channels=3
+momentum=0.9
+decay=0.0005
+
+learning_rate=0.01
+
+[crop]
+crop_height=224
+crop_width=224
+flip=1
+saturation=1
+exposure=1
+angle=0
+
+##### Conv 1 #####
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=7
+stride=2
+pad=1
+activation=leaky
+
+[maxpool]
+size=3
+stride=2
+
+
+##### Conv 2_x #####
+
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=64
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 3_x #####
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=128
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 4_x #####
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=256
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=1024
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+
+##### Conv 5_x #####
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=2
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=512
+size=3
+stride=1
+pad=1
+activation=leaky
+
+[convolutional]
+batch_normalize=1
+filters=2048
+size=1
+stride=1
+pad=1
+activation=leaky
+
+[shortcut]
+from = -4
+
+[avgpool]
+
+[connected]
+output=1000
+activation=leaky
+
+[softmax]
+groups=1
+
+[cost]
+type=sse
+
diff --git a/src/avgpool_layer.h b/src/avgpool_layer.h
index 634581a..f8329ae 100644
--- a/src/avgpool_layer.h
+++ b/src/avgpool_layer.h
@@ -2,9 +2,9 @@
 #define AVGPOOL_LAYER_H
 
 #include "image.h"
-#include "params.h"
 #include "cuda.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer avgpool_layer;
 
diff --git a/src/blas.c b/src/blas.c
index 3785937..941109e 100644
--- a/src/blas.c
+++ b/src/blas.c
@@ -1,6 +1,22 @@
 #include "blas.h"
 #include "math.h"
 
+void shortcut_cpu(float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2)
+{
+    int i,j,k,b;
+    for(b = 0; b < batch; ++b){
+        for(k = 0; k < c && k < c2; ++k){
+            for(j = 0; j < h/sample; ++j){
+                for(i = 0; i < w/sample; ++i){
+                    int out_index = i*sample + w*(j*sample + h*(k + c*b));
+                    int add_index = b*w*stride/sample*h*stride/sample*c2 + i*stride + w*stride/sample*(j*stride + h*stride/sample*k);
+                    out[out_index] += add[add_index];
+                }
+            }
+        }
+    }
+}
+
 void mean_cpu(float *x, int batch, int filters, int spatial, float *mean)
 {
     float scale = 1./(batch * spatial);
diff --git a/src/blas.h b/src/blas.h
index 5a50db5..023024a 100644
--- a/src/blas.h
+++ b/src/blas.h
@@ -15,6 +15,7 @@
 void scal_cpu(int N, float ALPHA, float *X, int INCX);
 float dot_cpu(int N, float *X, int INCX, float *Y, int INCY);
 void test_gpu_blas();
+void shortcut_cpu(float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2);
 
 void mean_cpu(float *x, int batch, int filters, int spatial, float *mean);
 void variance_cpu(float *x, float *mean, int batch, int filters, int spatial, float *variance);
@@ -43,5 +44,6 @@
 
 void fast_variance_gpu(float *x, float *mean, int batch, int filters, int spatial, float *variance);
 void fast_mean_gpu(float *x, int batch, int filters, int spatial, float *mean);
+void shortcut_gpu(float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2);
 #endif
 #endif
diff --git a/src/blas_kernels.cu b/src/blas_kernels.cu
index 17955e4..8f05eb9 100644
--- a/src/blas_kernels.cu
+++ b/src/blas_kernels.cu
@@ -228,6 +228,7 @@
     if(i < N) Y[i*INCY] *= X[i*INCX];
 }
 
+
 extern "C" void normalize_gpu(float *x, float *mean, float *variance, int batch, int filters, int spatial)
 {
     size_t N = batch*filters*spatial;
@@ -372,3 +373,27 @@
     fill_kernel<<<cuda_gridsize(N), BLOCK>>>(N, ALPHA, X, INCX);
     check_error(cudaPeekAtLastError());
 }
+
+__global__ void shortcut_kernel(int size, float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2, int min_c)
+{
+    int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x;
+    if (id >= size) return;
+    int i = id % (w/sample);
+    id /= (w/sample);
+    int j = id % (h/sample);
+    id /= (h/sample);
+    int k = id % min_c;
+    id /= min_c;
+    int b = id;
+    int out_index = i*sample + w*(j*sample + h*(k + c*b));
+    int add_index = b*w*stride/sample*h*stride/sample*c2 + i*stride + w*stride/sample*(j*stride + h*stride/sample*k);
+    out[out_index] += add[add_index];
+}
+
+extern "C" void shortcut_gpu(float *out, int w, int h, int c, int batch, int sample, float *add, int stride, int c2)
+{
+    int min_c = (c < c2) ? c : c2;
+    int size = batch * w/sample * h/sample * min_c;
+    shortcut_kernel<<<cuda_gridsize(size), BLOCK>>>(size, out, w, h, c, batch, sample, add, stride, c2, min_c);
+    check_error(cudaPeekAtLastError());
+}
diff --git a/src/classifier.c b/src/classifier.c
index c0006e6..8a3ae5a 100644
--- a/src/classifier.c
+++ b/src/classifier.c
@@ -131,7 +131,7 @@
     char *label_list = option_find_str(options, "labels", "data/labels.list");
     char *valid_list = option_find_str(options, "valid", "data/train.list");
     int classes = option_find_int(options, "classes", 2);
-    int topk = option_find_int(options, "topk", 1);
+    int topk = option_find_int(options, "top", 1);
 
     char **labels = get_labels(label_list);
     list *plist = get_paths(valid_list);
@@ -194,11 +194,12 @@
 
     list *options = read_data_cfg(datacfg);
 
-    char *label_list = option_find_str(options, "labels", "data/labels.list");
+    char *name_list = option_find_str(options, "names", 0);
+    if(!name_list) name_list = option_find_str(options, "labels", "data/labels.list");
     int top = option_find_int(options, "top", 1);
 
     int i = 0;
-    char **names = get_labels(label_list);
+    char **names = get_labels(name_list);
     clock_t time;
     int indexes[10];
     char buff[256];
diff --git a/src/connected_layer.c b/src/connected_layer.c
index 640e8b8..2d83dd9 100644
--- a/src/connected_layer.c
+++ b/src/connected_layer.c
@@ -25,13 +25,13 @@
     l.weight_updates = calloc(inputs*outputs, sizeof(float));
     l.bias_updates = calloc(outputs, sizeof(float));
 
-    l.weights = calloc(inputs*outputs, sizeof(float));
+    l.weights = calloc(outputs*inputs, sizeof(float));
     l.biases = calloc(outputs, sizeof(float));
 
 
     //float scale = 1./sqrt(inputs);
     float scale = sqrt(2./inputs);
-    for(i = 0; i < inputs*outputs; ++i){
+    for(i = 0; i < outputs*inputs; ++i){
         l.weights[i] = 2*scale*rand_uniform() - scale;
     }
 
@@ -40,10 +40,10 @@
     }
 
 #ifdef GPU
-    l.weights_gpu = cuda_make_array(l.weights, inputs*outputs);
+    l.weights_gpu = cuda_make_array(l.weights, outputs*inputs);
     l.biases_gpu = cuda_make_array(l.biases, outputs);
 
-    l.weight_updates_gpu = cuda_make_array(l.weight_updates, inputs*outputs);
+    l.weight_updates_gpu = cuda_make_array(l.weight_updates, outputs*inputs);
     l.bias_updates_gpu = cuda_make_array(l.bias_updates, outputs);
 
     l.output_gpu = cuda_make_array(l.output, outputs*batch);
@@ -76,7 +76,7 @@
     float *a = state.input;
     float *b = l.weights;
     float *c = l.output;
-    gemm(0,0,m,n,k,1,a,k,b,n,1,c,n);
+    gemm(0,1,m,n,k,1,a,k,b,k,1,c,n);
     activate_array(l.output, l.outputs*l.batch, l.activation);
 }
 
@@ -87,11 +87,11 @@
     for(i = 0; i < l.batch; ++i){
         axpy_cpu(l.outputs, 1, l.delta + i*l.outputs, 1, l.bias_updates, 1);
     }
-    int m = l.inputs;
+    int m = l.outputs;
     int k = l.batch;
-    int n = l.outputs;
-    float *a = state.input;
-    float *b = l.delta;
+    int n = l.inputs;
+    float *a = l.delta;
+    float *b = state.input;
     float *c = l.weight_updates;
     gemm(1,0,m,n,k,1,a,m,b,n,1,c,n);
 
@@ -103,7 +103,7 @@
     b = l.weights;
     c = state.delta;
 
-    if(c) gemm(0,1,m,n,k,1,a,k,b,k,1,c,n);
+    if(c) gemm(0,0,m,n,k,1,a,k,b,n,1,c,n);
 }
 
 #ifdef GPU
@@ -146,7 +146,7 @@
     float * a = state.input;
     float * b = l.weights_gpu;
     float * c = l.output_gpu;
-    gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n);
+    gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n);
     activate_array_ongpu(l.output_gpu, l.outputs*l.batch, l.activation);
 
 /*
@@ -163,11 +163,11 @@
     for(i = 0; i < l.batch; ++i){
         axpy_ongpu_offset(l.outputs, 1, l.delta_gpu, i*l.outputs, 1, l.bias_updates_gpu, 0, 1);
     }
-    int m = l.inputs;
+    int m = l.outputs;
     int k = l.batch;
-    int n = l.outputs;
-    float * a = state.input;
-    float * b = l.delta_gpu;
+    int n = l.inputs;
+    float * a = l.delta_gpu;
+    float * b = state.input;
     float * c = l.weight_updates_gpu;
     gemm_ongpu(1,0,m,n,k,1,a,m,b,n,1,c,n);
 
@@ -179,6 +179,6 @@
     b = l.weights_gpu;
     c = state.delta;
 
-    if(c) gemm_ongpu(0,1,m,n,k,1,a,k,b,k,1,c,n);
+    if(c) gemm_ongpu(0,0,m,n,k,1,a,k,b,n,1,c,n);
 }
 #endif
diff --git a/src/connected_layer.h b/src/connected_layer.h
index cea5a02..2bf53b2 100644
--- a/src/connected_layer.h
+++ b/src/connected_layer.h
@@ -2,8 +2,8 @@
 #define CONNECTED_LAYER_H
 
 #include "activations.h"
-#include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer connected_layer;
 
diff --git a/src/convolutional_layer.h b/src/convolutional_layer.h
index 70a3d05..436ed7e 100644
--- a/src/convolutional_layer.h
+++ b/src/convolutional_layer.h
@@ -6,6 +6,7 @@
 #include "image.h"
 #include "activations.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer convolutional_layer;
 
diff --git a/src/cost_layer.h b/src/cost_layer.h
index aa4af2f..a692831 100644
--- a/src/cost_layer.h
+++ b/src/cost_layer.h
@@ -1,7 +1,7 @@
 #ifndef COST_LAYER_H
 #define COST_LAYER_H
-#include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer cost_layer;
 
diff --git a/src/crop_layer.h b/src/crop_layer.h
index 8164186..b409351 100644
--- a/src/crop_layer.h
+++ b/src/crop_layer.h
@@ -4,6 +4,7 @@
 #include "image.h"
 #include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer crop_layer;
 
diff --git a/src/cuda.c b/src/cuda.c
index e95feff..d773d0b 100644
--- a/src/cuda.c
+++ b/src/cuda.c
@@ -67,6 +67,7 @@
         status = cudaMemcpy(x_gpu, x, size, cudaMemcpyHostToDevice);
         check_error(status);
     }
+    if(!x_gpu) error("Cuda malloc failed\n");
     return x_gpu;
 }
 
diff --git a/src/data.c b/src/data.c
index 9b84c5a..8d76276 100644
--- a/src/data.c
+++ b/src/data.c
@@ -149,6 +149,43 @@
     }
 }
 
+void fill_truth_swag(char *path, float *truth, int classes, int flip, float dx, float dy, float sx, float sy)
+{
+    char *labelpath = find_replace(path, "images", "labels");
+    labelpath = find_replace(labelpath, "JPEGImages", "labels");
+
+    labelpath = find_replace(labelpath, ".jpg", ".txt");
+    labelpath = find_replace(labelpath, ".JPG", ".txt");
+    labelpath = find_replace(labelpath, ".JPEG", ".txt");
+    int count = 0;
+    box_label *boxes = read_boxes(labelpath, &count);
+    randomize_boxes(boxes, count);
+    correct_boxes(boxes, count, dx, dy, sx, sy, flip);
+    float x,y,w,h;
+    int id;
+    int i;
+
+    for (i = 0; i < count && i < 30; ++i) {
+        x =  boxes[i].x;
+        y =  boxes[i].y;
+        w =  boxes[i].w;
+        h =  boxes[i].h;
+        id = boxes[i].id;
+
+        if (w < .0 || h < .0) continue;
+
+        int index = (4+classes) * i;
+
+        truth[index++] = x;
+        truth[index++] = y;
+        truth[index++] = w;
+        truth[index++] = h;
+
+        if (id < classes) truth[index+id] = 1;
+    }
+    free(boxes);
+}
+
 void fill_truth_region(char *path, float *truth, int classes, int num_boxes, int flip, float dx, float dy, float sx, float sy)
 {
     char *labelpath = find_replace(path, "images", "labels");
@@ -482,6 +519,59 @@
     return d;
 }
 
+data load_data_swag(char **paths, int n, int classes, float jitter)
+{
+    int index = rand_r(&data_seed)%n;
+    char *random_path = paths[index];
+    
+    image orig = load_image_color(random_path, 0, 0);
+    int h = orig.h;
+    int w = orig.w;
+
+    data d;
+    d.shallow = 0;
+    d.w = w;
+    d.h = h;
+
+    d.X.rows = 1;
+    d.X.vals = calloc(d.X.rows, sizeof(float*));
+    d.X.cols = h*w*3;
+
+    int k = (4+classes)*30;
+    d.y = make_matrix(1, k);
+
+    int dw = w*jitter;
+    int dh = h*jitter;
+
+    int pleft  = (rand_uniform() * 2*dw - dw);
+    int pright = (rand_uniform() * 2*dw - dw);
+    int ptop   = (rand_uniform() * 2*dh - dh);
+    int pbot   = (rand_uniform() * 2*dh - dh);
+
+    int swidth =  w - pleft - pright;
+    int sheight = h - ptop - pbot;
+
+    float sx = (float)swidth  / w;
+    float sy = (float)sheight / h;
+
+    int flip = rand_r(&data_seed)%2;
+    image cropped = crop_image(orig, pleft, ptop, swidth, sheight);
+
+    float dx = ((float)pleft/w)/sx;
+    float dy = ((float)ptop /h)/sy;
+
+    image sized = resize_image(cropped, w, h);
+    if(flip) flip_image(sized);
+    d.X.vals[0] = sized.data;
+
+    fill_truth_swag(random_path, d.y.vals[0], classes, flip, dx, dy, 1./sx, 1./sy);
+
+    free_image(orig);
+    free_image(cropped);
+
+    return d;
+}
+
 data load_data_detection(int n, char **paths, int m, int classes, int w, int h, int num_boxes, int background)
 {
     char **random_paths = get_random_paths(paths, n, m);
@@ -559,6 +649,8 @@
         *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h);
     } else if (a.type == REGION_DATA){
         *a.d = load_data_region(a.n, a.paths, a.m, a.w, a.h, a.num_boxes, a.classes, a.jitter);
+    } else if (a.type == SWAG_DATA){
+        *a.d = load_data_swag(a.paths, a.n, a.classes, a.jitter);
     } else if (a.type == COMPARE_DATA){
         *a.d = load_data_compare(a.n, a.paths, a.m, a.classes, a.w, a.h);
     } else if (a.type == IMAGE_DATA){
diff --git a/src/data.h b/src/data.h
index 0dacea2..0ebdfc3 100644
--- a/src/data.h
+++ b/src/data.h
@@ -20,13 +20,14 @@
 }
 
 typedef struct{
+    int w, h;
     matrix X;
     matrix y;
     int shallow;
 } data;
 
 typedef enum {
-    CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA
+    CLASSIFICATION_DATA, DETECTION_DATA, CAPTCHA_DATA, REGION_DATA, IMAGE_DATA, COMPARE_DATA, WRITING_DATA, SWAG_DATA
 } data_type;
 
 typedef struct load_args{
diff --git a/src/deconvolutional_layer.h b/src/deconvolutional_layer.h
index 74498c7..b6af397 100644
--- a/src/deconvolutional_layer.h
+++ b/src/deconvolutional_layer.h
@@ -6,6 +6,7 @@
 #include "image.h"
 #include "activations.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer deconvolutional_layer;
 
diff --git a/src/detection_layer.c b/src/detection_layer.c
index 33f4f0b..ca32bc0 100644
--- a/src/detection_layer.c
+++ b/src/detection_layer.c
@@ -146,7 +146,7 @@
                 }
                 float iou  = box_iou(out, truth);
 
-                //printf("%d", best_index);
+                //printf("%d,", best_index);
                 int p_index = index + locations*l.classes + i*l.n + best_index;
                 *(l.cost) -= l.noobject_scale * pow(l.output[p_index], 2);
                 *(l.cost) += l.object_scale * pow(1-l.output[p_index], 2);
diff --git a/src/detection_layer.h b/src/detection_layer.h
index 5e34ac7..75d9b7f 100644
--- a/src/detection_layer.h
+++ b/src/detection_layer.h
@@ -1,8 +1,8 @@
 #ifndef REGION_LAYER_H
 #define REGION_LAYER_H
 
-#include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer detection_layer;
 
diff --git a/src/dropout_layer.h b/src/dropout_layer.h
index b1dc883..0c2ce4d 100644
--- a/src/dropout_layer.h
+++ b/src/dropout_layer.h
@@ -3,6 +3,7 @@
 
 #include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer dropout_layer;
 
diff --git a/src/image.c b/src/image.c
index a8a6684..51871b5 100644
--- a/src/image.c
+++ b/src/image.c
@@ -1,5 +1,6 @@
 #include "image.h"
 #include "utils.h"
+#include "blas.h"
 #include <stdio.h>
 #include <math.h>
 
@@ -708,8 +709,14 @@
     image exp5 = copy_image(im);
     exposure_image(exp5, .5);
 
+    image r = resize_image(im, im.w/2, im.h/2);
+
+    image black = make_image(im.w, im.h, im.c);
+    shortcut_cpu(black.data, im.w, im.h, im.c, 1, 2, r.data, 1, r.c);
+
     show_image(im, "Original");
     show_image(gray, "Gray");
+    show_image(black, "Black");
     show_image(sat2, "Saturation-2");
     show_image(sat5, "Saturation-.5");
     show_image(exp2, "Exposure-2");
diff --git a/src/layer.h b/src/layer.h
index b3ab627..1b12009 100644
--- a/src/layer.h
+++ b/src/layer.h
@@ -3,6 +3,9 @@
 
 #include "activations.h"
 
+struct layer;
+typedef struct layer layer;
+
 typedef enum {
     CONVOLUTIONAL,
     DECONVOLUTIONAL,
@@ -16,20 +19,22 @@
     COST,
     NORMALIZATION,
     AVGPOOL,
-    LOCAL
+    LOCAL,
+    SHORTCUT
 } LAYER_TYPE;
 
 typedef enum{
     SSE, MASKED
 } COST_TYPE;
 
-typedef struct {
+struct layer{
     LAYER_TYPE type;
     ACTIVATION activation;
     COST_TYPE cost_type;
     int batch_normalize;
     int batch;
     int forced;
+    int flipped;
     int inputs;
     int outputs;
     int truths;
@@ -45,6 +50,7 @@
     int crop_height;
     int sqrt;
     int flip;
+    int index;
     float angle;
     float jitter;
     float saturation;
@@ -144,7 +150,7 @@
     float * squared_gpu;
     float * norms_gpu;
     #endif
-} layer;
+};
 
 void free_layer(layer);
 
diff --git a/src/local_layer.h b/src/local_layer.h
index 675a5fb..28915d8 100644
--- a/src/local_layer.h
+++ b/src/local_layer.h
@@ -2,10 +2,10 @@
 #define LOCAL_LAYER_H
 
 #include "cuda.h"
-#include "params.h"
 #include "image.h"
 #include "activations.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer local_layer;
 
diff --git a/src/maxpool_layer.h b/src/maxpool_layer.h
index ab13874..b91c2c1 100644
--- a/src/maxpool_layer.h
+++ b/src/maxpool_layer.h
@@ -5,6 +5,7 @@
 #include "params.h"
 #include "cuda.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer maxpool_layer;
 
diff --git a/src/network.c b/src/network.c
index d9585c4..8dee8cc 100644
--- a/src/network.c
+++ b/src/network.c
@@ -19,6 +19,7 @@
 #include "softmax_layer.h"
 #include "dropout_layer.h"
 #include "route_layer.h"
+#include "shortcut_layer.h"
 
 int get_current_batch(network net)
 {
@@ -94,6 +95,8 @@
             return "cost";
         case ROUTE:
             return "route";
+        case SHORTCUT:
+            return "shortcut";
         case NORMALIZATION:
             return "normalization";
         default:
@@ -119,6 +122,7 @@
 {
     int i;
     for(i = 0; i < net.n; ++i){
+        state.index = i;
         layer l = net.layers[i];
         if(l.delta){
             scal_cpu(l.outputs * l.batch, 0, l.delta, 1);
@@ -149,6 +153,8 @@
             forward_dropout_layer(l, state);
         } else if(l.type == ROUTE){
             forward_route_layer(l, net);
+        } else if(l.type == SHORTCUT){
+            forward_shortcut_layer(l, state);
         }
         state.input = l.output;
     }
@@ -211,6 +217,7 @@
     float *original_input = state.input;
     float *original_delta = state.delta;
     for(i = net.n-1; i >= 0; --i){
+        state.index = i;
         if(i == 0){
             state.input = original_input;
             state.delta = original_delta;
@@ -244,6 +251,8 @@
             backward_cost_layer(l, state);
         } else if(l.type == ROUTE){
             backward_route_layer(l, net);
+        } else if(l.type == SHORTCUT){
+            backward_shortcut_layer(l, state);
         }
     }
 }
@@ -255,6 +264,8 @@
     if(gpu_index >= 0) return train_network_datum_gpu(net, x, y);
 #endif
     network_state state;
+    state.index = 0;
+    state.net = net;
     state.input = x;
     state.delta = 0;
     state.truth = y;
@@ -307,6 +318,8 @@
 {
     int i,j;
     network_state state;
+    state.index = 0;
+    state.net = net;
     state.train = 1;
     state.delta = 0;
     float sum = 0;
@@ -443,6 +456,8 @@
 #endif
 
     network_state state;
+    state.net = net;
+    state.index = 0;
     state.input = input;
     state.truth = 0;
     state.train = 0;
diff --git a/src/network.h b/src/network.h
index 428ff52..4c108df 100644
--- a/src/network.h
+++ b/src/network.h
@@ -3,15 +3,15 @@
 #define NETWORK_H
 
 #include "image.h"
-#include "detection_layer.h"
 #include "layer.h"
 #include "data.h"
+#include "params.h"
 
 typedef enum {
     CONSTANT, STEP, EXP, POLY, STEPS, SIG
 } learning_rate_policy;
 
-typedef struct {
+typedef struct network{
     int n;
     int batch;
     int *seen;
@@ -43,6 +43,15 @@
     #endif
 } network;
 
+typedef struct network_state {
+    float *truth;
+    float *input;
+    float *delta;
+    int train;
+    int index;
+    network net;
+} network_state;
+
 #ifdef GPU
 float train_network_datum_gpu(network net, float *x, float *y);
 float *network_predict_gpu(network net, float *input);
diff --git a/src/network_kernels.cu b/src/network_kernels.cu
index 26b8404..0b50647 100644
--- a/src/network_kernels.cu
+++ b/src/network_kernels.cu
@@ -27,6 +27,7 @@
 #include "softmax_layer.h"
 #include "dropout_layer.h"
 #include "route_layer.h"
+#include "shortcut_layer.h"
 #include "blas.h"
 }
 
@@ -38,6 +39,7 @@
 {
     int i;
     for(i = 0; i < net.n; ++i){
+        state.index = i;
         layer l = net.layers[i];
         if(l.delta_gpu){
             fill_ongpu(l.outputs * l.batch, 0, l.delta_gpu, 1);
@@ -68,6 +70,8 @@
             forward_dropout_layer_gpu(l, state);
         } else if(l.type == ROUTE){
             forward_route_layer_gpu(l, net);
+        } else if(l.type == SHORTCUT){
+            forward_shortcut_layer_gpu(l, state);
         }
         state.input = l.output_gpu;
     }
@@ -79,6 +83,7 @@
     float * original_input = state.input;
     float * original_delta = state.delta;
     for(i = net.n-1; i >= 0; --i){
+        state.index = i;
         layer l = net.layers[i];
         if(i == 0){
             state.input = original_input;
@@ -112,6 +117,8 @@
             backward_cost_layer_gpu(l, state);
         } else if(l.type == ROUTE){
             backward_route_layer_gpu(l, net);
+        } else if(l.type == SHORTCUT){
+            backward_shortcut_layer_gpu(l, state);
         }
     }
 }
@@ -138,6 +145,8 @@
 float train_network_datum_gpu(network net, float *x, float *y)
 {
     network_state state;
+    state.index = 0;
+    state.net = net;
     int x_size = get_network_input_size(net)*net.batch;
     int y_size = get_network_output_size(net)*net.batch;
     if(net.layers[net.n-1].type == DETECTION) y_size = net.layers[net.n-1].truths*net.batch;
@@ -178,6 +187,8 @@
 {
     int size = get_network_input_size(net) * net.batch;
     network_state state;
+    state.index = 0;
+    state.net = net;
     state.input = cuda_make_array(input, size);
     state.truth = 0;
     state.train = 0;
diff --git a/src/normalization_layer.h b/src/normalization_layer.h
index c90780e..ab32776 100644
--- a/src/normalization_layer.h
+++ b/src/normalization_layer.h
@@ -3,7 +3,7 @@
 
 #include "image.h"
 #include "layer.h"
-#include "params.h"
+#include "network.h"
 
 layer make_normalization_layer(int batch, int w, int h, int c, int size, float alpha, float beta, float kappa);
 void resize_normalization_layer(layer *layer, int h, int w);
diff --git a/src/params.h b/src/params.h
index 7343a07..8b13789 100644
--- a/src/params.h
+++ b/src/params.h
@@ -1,12 +1 @@
-#ifndef PARAMS_H
-#define PARAMS_H
-
-typedef struct {
-    float *truth;
-    float *input;
-    float *delta;
-    int train;
-} network_state;
-
-#endif
 
diff --git a/src/parser.c b/src/parser.c
index 277c6e2..8efafad 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -17,6 +17,7 @@
 #include "avgpool_layer.h"
 #include "local_layer.h"
 #include "route_layer.h"
+#include "shortcut_layer.h"
 #include "list.h"
 #include "option_list.h"
 #include "utils.h"
@@ -37,6 +38,7 @@
 int is_softmax(section *s);
 int is_normalization(section *s);
 int is_crop(section *s);
+int is_shortcut(section *s);
 int is_cost(section *s);
 int is_detection(section *s);
 int is_route(section *s);
@@ -80,6 +82,7 @@
     int h;
     int w;
     int c;
+    int index;
 } size_params;
 
 deconvolutional_layer parse_deconvolutional(list *options, size_params params)
@@ -148,6 +151,7 @@
     int batch_normalize = option_find_int_quiet(options, "batch_normalize", 0);
 
     convolutional_layer layer = make_convolutional_layer(batch,h,w,c,n,size,stride,pad,activation, batch_normalize);
+    layer.flipped = option_find_int_quiet(options, "flipped", 0);
 
     char *weights = option_find_str(options, "weights", 0);
     char *biases = option_find_str(options, "biases", 0);
@@ -287,6 +291,20 @@
     return l;
 }
 
+layer parse_shortcut(list *options, size_params params, network net)
+{
+    char *l = option_find(options, "from");   
+    int index = atoi(l);
+    if(index < 0) index = params.index + index;
+
+    int batch = params.batch;
+    layer from = net.layers[index];
+
+    layer s = make_shortcut_layer(batch, index, params.w, params.h, params.c, from.out_w, from.out_h, from.out_c);
+    return s;
+}
+
+
 route_layer parse_route(list *options, size_params params, network net)
 {
     char *l = option_find(options, "layers");   
@@ -303,13 +321,14 @@
     for(i = 0; i < n; ++i){
         int index = atoi(l);
         l = strchr(l, ',')+1;
+        if(index < 0) index = params.index + index;
         layers[i] = index;
         sizes[i] = net.layers[index].outputs;
     }
     int batch = params.batch;
 
     route_layer layer = make_route_layer(batch, n, layers, sizes);
-    
+
     convolutional_layer first = net.layers[layers[0]];
     layer.out_w = first.out_w;
     layer.out_h = first.out_h;
@@ -419,6 +438,7 @@
     int count = 0;
     free_section(s);
     while(n){
+        params.index = count;
         fprintf(stderr, "%d: ", count);
         s = (section *)n->val;
         options = s->options;
@@ -447,6 +467,8 @@
             l = parse_avgpool(options, params);
         }else if(is_route(s)){
             l = parse_route(options, params, net);
+        }else if(is_shortcut(s)){
+            l = parse_shortcut(options, params, net);
         }else if(is_dropout(s)){
             l = parse_dropout(options, params);
             l.output = net.layers[count-1].output;
@@ -464,13 +486,13 @@
         net.layers[count] = l;
         free_section(s);
         n = n->next;
+        ++count;
         if(n){
             params.h = l.out_h;
             params.w = l.out_w;
             params.c = l.out_c;
             params.inputs = l.outputs;
         }
-        ++count;
     }   
     free_list(sections);
     net.outputs = get_network_output_size(net);
@@ -478,6 +500,10 @@
     return net;
 }
 
+int is_shortcut(section *s)
+{
+    return (strcmp(s->type, "[shortcut]")==0);
+}
 int is_crop(section *s)
 {
     return (strcmp(s->type, "[crop]")==0);
@@ -625,9 +651,12 @@
     FILE *fp = fopen(filename, "w");
     if(!fp) file_error(filename);
 
-    fwrite(&net.learning_rate, sizeof(float), 1, fp);
-    fwrite(&net.momentum, sizeof(float), 1, fp);
-    fwrite(&net.decay, sizeof(float), 1, fp);
+    int major = 0;
+    int minor = 1;
+    int revision = 0;
+    fwrite(&major, sizeof(int), 1, fp);
+    fwrite(&minor, sizeof(int), 1, fp);
+    fwrite(&revision, sizeof(int), 1, fp);
     fwrite(net.seen, sizeof(int), 1, fp);
 
     int i;
@@ -674,6 +703,19 @@
     save_weights_upto(net, filename, net.n);
 }
 
+void transpose_matrix(float *a, int rows, int cols)
+{
+    float *transpose = calloc(rows*cols, sizeof(float));
+    int x, y;
+    for(x = 0; x < rows; ++x){
+        for(y = 0; y < cols; ++y){
+            transpose[y*rows + x] = a[x*cols + y];
+        }
+    }
+    memcpy(a, transpose, rows*cols*sizeof(float));
+    free(transpose);
+}
+
 void load_weights_upto(network *net, char *filename, int cutoff)
 {
     fprintf(stderr, "Loading weights from %s...", filename);
@@ -681,10 +723,12 @@
     FILE *fp = fopen(filename, "r");
     if(!fp) file_error(filename);
 
-    float garbage;
-    fread(&garbage, sizeof(float), 1, fp);
-    fread(&garbage, sizeof(float), 1, fp);
-    fread(&garbage, sizeof(float), 1, fp);
+    int major;
+    int minor;
+    int revision;
+    fread(&major, sizeof(int), 1, fp);
+    fread(&minor, sizeof(int), 1, fp);
+    fread(&revision, sizeof(int), 1, fp);
     fread(net->seen, sizeof(int), 1, fp);
 
     int i;
@@ -700,6 +744,9 @@
                 fread(l.rolling_variance, sizeof(float), l.n, fp);
             }
             fread(l.filters, sizeof(float), num, fp);
+            if (l.flipped) {
+                transpose_matrix(l.filters, l.c*l.size*l.size, l.n);
+            }
 #ifdef GPU
             if(gpu_index >= 0){
                 push_convolutional_layer(l);
@@ -719,6 +766,9 @@
         if(l.type == CONNECTED){
             fread(l.biases, sizeof(float), l.outputs, fp);
             fread(l.weights, sizeof(float), l.outputs*l.inputs, fp);
+            if(major > 1000 || minor > 1000){
+                transpose_matrix(l.weights, l.inputs, l.outputs);
+            }
 #ifdef GPU
             if(gpu_index >= 0){
                 push_connected_layer(l);
diff --git a/src/shortcut_layer.c b/src/shortcut_layer.c
new file mode 100644
index 0000000..ff1d50f
--- /dev/null
+++ b/src/shortcut_layer.c
@@ -0,0 +1,64 @@
+#include "shortcut_layer.h"
+#include "cuda.h"
+#include "blas.h"
+#include <stdio.h>
+#include <assert.h>
+
+layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int h2, int c2)
+{
+    fprintf(stderr,"Shortcut Layer: %d\n", index);
+    layer l = {0};
+    l.type = SHORTCUT;
+    l.batch = batch;
+    l.w = w;
+    l.h = h;
+    l.c = c;
+    l.out_w = w;
+    l.out_h = h;
+    l.out_c = c;
+    l.outputs = w*h*c;
+    l.inputs = w*h*c;
+    int stride = w2 / w;
+
+    assert(stride * w == w2);
+    assert(stride * h == h2);
+    assert(c >= c2);
+
+    l.stride = stride;
+    l.n = c2;
+    l.index = index;
+
+    l.delta =  calloc(l.outputs*batch, sizeof(float));
+    l.output = calloc(l.outputs*batch, sizeof(float));;
+    #ifdef GPU
+    l.delta_gpu =  cuda_make_array(l.delta, l.outputs*batch);
+    l.output_gpu = cuda_make_array(l.output, l.outputs*batch);
+    #endif
+    return l;
+}
+
+void forward_shortcut_layer(const layer l, network_state state)
+{
+    copy_cpu(l.outputs*l.batch, state.input, 1, l.output, 1);
+    shortcut_cpu(l.output, l.w, l.h, l.c, l.batch, 1, state.net.layers[l.index].output, l.stride, l.n);
+}
+
+void backward_shortcut_layer(const layer l, network_state state)
+{
+    copy_cpu(l.outputs*l.batch, l.delta, 1, state.delta, 1);
+    shortcut_cpu(state.net.layers[l.index].delta, l.w*l.stride, l.h*l.stride, l.n, l.batch, l.stride, l.delta, 1, l.c);
+}
+
+#ifdef GPU
+void forward_shortcut_layer_gpu(const layer l, network_state state)
+{
+    copy_ongpu(l.outputs*l.batch, state.input, 1, l.output_gpu, 1);
+    shortcut_gpu(l.output_gpu, l.w, l.h, l.c, l.batch, 1, state.net.layers[l.index].output_gpu, l.stride, l.n);
+}
+
+void backward_shortcut_layer_gpu(const layer l, network_state state)
+{
+    copy_ongpu(l.outputs*l.batch, l.delta_gpu, 1, state.delta, 1);
+    shortcut_gpu(state.net.layers[l.index].delta_gpu, l.w*l.stride, l.h*l.stride, l.n, l.batch, l.stride, l.delta_gpu, 1, l.c);
+}
+#endif
diff --git a/src/shortcut_layer.h b/src/shortcut_layer.h
new file mode 100644
index 0000000..c09a809
--- /dev/null
+++ b/src/shortcut_layer.h
@@ -0,0 +1,16 @@
+#ifndef SHORTCUT_LAYER_H
+#define SHORTCUT_LAYER_H
+
+#include "layer.h"
+#include "network.h"
+
+layer make_shortcut_layer(int batch, int index, int w, int h, int c, int w2, int h2, int c2);
+void forward_shortcut_layer(const layer l, network_state state);
+void backward_shortcut_layer(const layer l, network_state state);
+
+#ifdef GPU
+void forward_shortcut_layer_gpu(const layer l, network_state state);
+void backward_shortcut_layer_gpu(const layer l, network_state state);
+#endif
+
+#endif
diff --git a/src/softmax_layer.h b/src/softmax_layer.h
index f29c652..9cbcd69 100644
--- a/src/softmax_layer.h
+++ b/src/softmax_layer.h
@@ -2,6 +2,7 @@
 #define SOFTMAX_LAYER_H
 #include "params.h"
 #include "layer.h"
+#include "network.h"
 
 typedef layer softmax_layer;
 
diff --git a/src/yolo.c b/src/yolo.c
index d62c533..a6c1e78 100644
--- a/src/yolo.c
+++ b/src/yolo.c
@@ -255,9 +255,8 @@
     int i=0;
 
     float thresh = .001;
-    int nms = 0;
     float iou_thresh = .5;
-    float nms_thresh = .5;
+    float nms = 0;
 
     int total = 0;
     int correct = 0;
@@ -271,7 +270,7 @@
         char *id = basecfg(path);
         float *predictions = network_predict(net, sized.data);
         convert_yolo_detections(predictions, classes, l.n, square, side, 1, 1, thresh, probs, boxes, 1);
-        if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms_thresh);
+        if (nms) do_nms(boxes, probs, side*side*l.n, 1, nms);
 
         char *labelpath = find_replace(path, "images", "labels");
         labelpath = find_replace(labelpath, "JPEGImages", "labels");

--
Gitblit v1.10.0