diff options
-rwxr-xr-x | data/get_mnist.sh | 18 | ||||
-rw-r--r-- | data/lenet.prototxt | 122 | ||||
-rw-r--r-- | data/lenet_test.prototxt | 123 | ||||
-rw-r--r-- | src/caffe/pyutil/drawnet.py | 19 |
4 files changed, 280 insertions, 2 deletions
diff --git a/data/get_mnist.sh b/data/get_mnist.sh new file mode 100755 index 00000000..ec979bd7 --- /dev/null +++ b/data/get_mnist.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env sh +# This scripts downloads the mnist data and unzips it. + +echo "Downloading..." + +wget -q http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz +wget -q http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz +wget -q http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz +wget -q http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz + +echo "Unzipping..." + +gunzip train-images-idx3-ubyte.gz +gunzip train-labels-idx1-ubyte.gz +gunzip t10k-images-idx3-ubyte.gz +gunzip t10k-labels-idx1-ubyte.gz + +echo "Done." diff --git a/data/lenet.prototxt b/data/lenet.prototxt new file mode 100644 index 00000000..085ed43f --- /dev/null +++ b/data/lenet.prototxt @@ -0,0 +1,122 @@ +name: "LeNet" +layers { + layer { + name: "mnist" + type: "data" + source: "data/mnist-train-leveldb" + batchsize: 64 + scale: 0.00390625 + } + top: "data" + top: "label" +} +layers { + layer { + name: "conv1" + type: "conv" + num_output: 20 + kernelsize: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 2 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "conv2" + type: "conv" + num_output: 50 + kernelsize: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "pool1" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 2 + stride: 2 + pool: MAX + } + bottom: "conv2" + top: "pool2" +} +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "pool2" + top: "ip1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "ip1" + top: "ip1" +} +layers { + layer { + name: "ip2" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + blobs_lr: 1. + blobs_lr: 2. + } + bottom: "ip1" + top: "ip2" +} +layers { + layer { + name: "prob" + type: "softmax_loss" + } + bottom: "ip2" + bottom: "label" +} diff --git a/data/lenet_test.prototxt b/data/lenet_test.prototxt new file mode 100644 index 00000000..fdda4a67 --- /dev/null +++ b/data/lenet_test.prototxt @@ -0,0 +1,123 @@ +name: "LeNet-test" +layers { + layer { + name: "mnist" + type: "data" + source: "data/mnist-test-leveldb" + batchsize: 100 + scale: 0.00390625 + } + top: "data" + top: "label" +} +layers { + layer { + name: "conv1" + type: "conv" + num_output: 20 + kernelsize: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + bottom: "data" + top: "conv1" +} +layers { + layer { + name: "pool1" + type: "pool" + kernelsize: 2 + stride: 2 + pool: MAX + } + bottom: "conv1" + top: "pool1" +} +layers { + layer { + name: "conv2" + type: "conv" + num_output: 50 + kernelsize: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + bottom: "pool1" + top: "conv2" +} +layers { + layer { + name: "pool2" + type: "pool" + kernelsize: 2 + stride: 2 + pool: MAX + } + bottom: "conv2" + top: "pool2" +} +layers { + layer { + name: "ip1" + type: "innerproduct" + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + bottom: "pool2" + top: "ip1" +} +layers { + layer { + name: "relu1" + type: "relu" + } + bottom: "ip1" + top: "ip1" +} +layers { + layer { + name: "ip2" + type: "innerproduct" + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + bottom: "ip1" + top: "ip2" +} +layers { + layer { + name: "prob" + type: "softmax" + } + bottom: "ip2" + top: "prob" +} +layers { + layer { + name: "accuracy" + type: "accuracy" + } + bottom: "prob" + bottom: "label" + top: "accuracy" +} diff --git a/src/caffe/pyutil/drawnet.py b/src/caffe/pyutil/drawnet.py index bce3dc4f..4f94f5d8 100644 --- a/src/caffe/pyutil/drawnet.py +++ b/src/caffe/pyutil/drawnet.py @@ -1,13 +1,17 @@ """Functions to draw a caffe NetParameter protobuffer. """ +from caffe.proto import caffe_pb2 +from google.protobuf import text_format import pydot +import os +import sys # Internal layer and blob styles. LAYER_STYLE = {'shape': 'record', 'fillcolor': '#6495ED', - 'style': 'filled,bold'} + 'style': 'filled'} NEURON_LAYER_STYLE = {'shape': 'record', 'fillcolor': '#90EE90', - 'style': 'filled,bold'} + 'style': 'filled'} BLOB_STYLE = {'shape': 'octagon', 'fillcolor': '#F0E68C', 'style': 'filled'} @@ -61,3 +65,14 @@ def draw_net_to_file(caffe_net, filename): with open(filename, 'w') as fid: fid.write(draw_net(caffe_net, ext)) +if __name__ == '__main__': + if len(sys.argv) != 3: + print 'Usage: %s input_net_proto_file output_image_file' % \ + os.path.basename(sys.argv[0]) + else: + net = caffe_pb2.NetParameter() + text_format.Merge(open(sys.argv[1]).read(), net) + print 'Drawing net to %s' % sys.argv[2] + draw_net_to_file(net, sys.argv[2]) + + |